文章目录
1 ioc概述
ioc控制反转又称依赖注入。是一种可以帮助我们解耦各业务对象间依赖关系的对象绑定方式
1.2 理念
public class A {
private B b=new B();
private C c=new C();
}
当我们A中需要使用B和C的方法时,通常需要这样构建相应的依赖类,然而我们是否真的有必要每次使用依赖对象都要主动使用,如果当我们需要使用其服务时,有人可以将依赖对象送过来就可以。
1.3 注入方式
在ioc模式中,被注入对象是通过一下三种方式来通知ioc service provider 为其进行服务
1.3.1 构造方法注入
public A(B b,C c){
this.b=b;
this.c=c;
}
ioc service provider 会检查被注入对象的构造方法,取得所需要的对象列表,为其注入对象。被注入对象的构造以及整个生命周期,都需要由ioc service provider 进行管理
1.3.2 setter 方法注入
public class A {
private B b;
private C c;
public void setB(B b) {
this.b = b;
}
public void setC(C c) {
this.c = c;
}
public C getC() {
return c;
}
public B getB() {
return b;
}
}
这样就可以通过setter方法将其相应的依赖对象设置到被注入对象。
1.3.3 接口注入
需要实现一个接口,此接口内提供一个方法,用来为其注入对象。ioc service provider 最终通过这些接口来了解应该为被注入对象注入什么对象。
1.3.4 三种方式的比较
- 接口注入
由于它需要强制实现不必要的接口,带有侵略性,现在基本不使用
- 构造的方法注入
优点是对象构造完成后,就进入就绪状态。缺点是依赖队象相同类型较多时,不容易通过反射进行处理,而且构造方法无法被继承与设置默认值。
- setter方法注入
描述性较好而且可以被继承,设置默认值而且灵活(推荐)
2 ioc service provider概述
Ioc Service Provider 是一个抽象出来的概念,是指代任何将ioc场景中的业务对象绑定到一起的实现方式。
2.1 ioc service provider的职责
主要有两个:业务对象的构建管理和业务对象间的依赖绑定
-
构建管理
ioc service provider 需要将所依赖的对象进行构建,使构建逻辑从被注入对象剥离。 -
依赖绑定
ioc service provider 通过结合之前构建和管理的所有业务对象,以及各个业务对象间可以识别的依赖关系,将这些对象所依赖的对象注入绑定,从而保证在每个对象使用时,就可以处于就绪状态。
2.2 管理对象之间的关系
被注入对象可以通过多种方式通知ioc service provider为其注入相应对象。但它也需要知道自己所管理和掌握的被注入对象和依赖对象之间的对应关系。
2.2.1 直接编码方式
在容器启动前我们可以通过程序编码方式将被注入对象和依赖对象注册到容器中,并明确相互间的依赖关系
container.register(IA.class,new A());
container.register(IB.class,new B());
....
A a= new container.get(IA.class);
通过为相应的类指定对应的具体实例,可以告知ioc容器,当我们需要这种类型的对象实例中,请将容器中注册的,对应的具体实例返回
2.2.2 配置文件方式
通过xml文件来管理对象注册和对象间依赖关系
<bean id ="a" class=".....IA">
<property name ="b">
<ref bean = "tb"/>
</property>
<property name ="c">
<ref bean = "tc"/>
</property>
</bean>
<bean id ="tb" class ="...IB">
</bean>
<bean id ="tc" class ="...Ic">
</bean>
从读取配置文件完成对象组装的容器获取A并使用
container.readConfigurationFiles(....);
A a = (A) container.getBean("a");