IoC的原理
一句化来概括 IoC :IoC 是一种帮助我们解耦个业务对象之间依赖关系的对象绑定方式。
首先来理解一下 IoC 原理,刚进公司的时候见领导的时候,听到总监和另外一名同事说 IoC 很简单,当时的具体设问场景我已经记不清了。在深入了解 IoC 之后,觉得确实简单,不过同一件事情、同一个思想,在具体落地实现中,才真正体现水平高低,这里简单介绍一下 IoC 原理。
一、未使用IoC思想
// 业务bean
public class ClassA{
private ClassB b = new ClassB();
public void setB(ClassB b) {
this.b = b
}
public ClassB getB() {
return this.b;
}
}
// 业务bean
public class ClassB{
}
// 处理逻辑
public class Test{
public static void main(){
ClassA a = new ClassA();
}
}
上面的代码中 ClassA 依赖于 ClassB,在 ClassA 实例化时对依赖的 ClassB 也做了实例化。被注入对象直接依赖于被依赖对象,被注入对象直接负责被依赖对象的实例化。
二、使用IoC思想
// 业务bean
public class ClassA{
// 不进行实例化动作
private ClassB b;
public void setB(ClassB b) {
this.b = b
}
public ClassB getB() {
return this.b;
}
}
// 业务bean
public class ClassB{
}
// 处理逻辑
public class Test{
public static void main(){
container.getBean("a");
}
}
// IoC容器
public class Container{
Map<String, Object> beanMap = new HashMap<>();
public Container() {
ClassB classB = new ClassB();
ClassA classA = new ClassA();
classA.setB(classB);
beanMpa.add("b", classB);
beanMap.add("a", classA);
}
public Object getBean(String beanName){
return beanMap.get(beanName);
}
}
被注入对象和依赖对象都由 Container(IoC Service Provider)统一管理,它们之间的依赖也由 Container 来注入。对 业务 bean 之前进行解耦,让我们的业务 bean 保持为简单的 POJO。
三、IoC的优势
依赖于接口,而不依赖于实现类,使系统和业务易于拓展。
// 业务bean
public class ClassA{
private ClassB b;
public void setB(ClassB b) {
this.b = b
}
public ClassB getB() {
return this.b;
}
}
// 业务接口(有多个实现类)
public interface ClassB{
}
// 业务bean(默认实现)
public interface ClassB1 implement ClassB{
}
// 业务bean(拓展实现)
public interface ClassB2 implement ClassB{
}
// 处理逻辑
public class Test{
public static void main(){
container.getBean("a1");
container.getBean("a2");
}
}
// IoC容器
public class Container{
Map<String, Object> beanMap = new HashMap<>();
public Container() {
ClassB classB1 = new ClassB1();
ClassB classB2 = new ClassB2();
ClassA classA1 = new ClassA();
classA1.setB(classB1);
ClassA classA2 = new ClassA();
classA2.setB(classB2);
beanMpa.add("b1", classB1);
beanMpa.add("b2", classB2);
beanMap.add("a", classA1);
beanMap.add("a", classA2);
}
public Object getBean(String beanName){
return beanMap.get(beanName);
}
}
面向接口编程,在增加 ClassB 新的实现类时,不需要修改依赖于 ClassB 接口的类。
四、写在最后
文中的 Container 相当粗糙,管理的更多的 bean ,这样硬编码的 Container 就力有不逮了。正常 Container 会配合指定的配置文件一起使用,Container 中包含稳定的处理逻辑,bean 的描述信息和 bean之前的依赖关系信息由指定的配置文件来给定。Container 通过读取配置文件来达到管理 bean 和 依赖注入的能力
一句化来概括 IoC :IoC 是一种帮助我们解耦个业务对象之间依赖关系的对象绑定方式。