1、引言
1.1 为什么需要IoC容器
(1)应用程序主动控制对象的实例化及依赖装配
A a = new AImpl();
B b = new BImpl();
a.setB(b);
本质:创建对象,主动实例化,直接获取依赖,主动装配 缺点:更换实现需要重新编译源代码
很难更换实现、难于测试
耦合实例生产者和实例消费者
A a = AFactory.createA();
B b = BFactory.createB();
a.setB(b)
本质:创建对象,被动实例化,间接获取依赖,主动装配(简单工厂) 缺点:更换实现需要重新编译源代码
很难更换实现、难于测试
A a = Factory.create(“a”);
B b = Factory.create(“b”);
a.setB(b);
<!—配置.properties-->
a=AImpl
b=BImpl
本质:创建对象,被动实例化,间接获取依赖, 主动装配
(工厂+反射+properties配置文件、Service Locator、注册表)
缺点:冗余的依赖装配逻辑
(2)可配置通用工厂:工厂主动控制,应用程序被动接受,控制权从应用程序转移到工厂
//返回装配好的a
A a = Factory.create(“a”);
<!—配置文件-->
<bean id=“a” class=“AImpl”>
<property name=“b” ref=“b”/>
</bean>
<bean id=“b” class=“BImpl”/>
本质:创建对象和装配对象, 被动实例化,被动接受依赖,被动装配
(工厂+反射+xml配置文件)
缺点:不通用
步骤:
1、读取配置文件根据配置文件通过反射 创建AImpl
2、发现A需要一个类型为B的属性b
3、到工厂中找名为b的对象,发现没有,读取配置文件通过反射创建BImpl
4、将b对象装配到a对象的b属性上
【组件的配置与使用分离开(解耦、更改实现无需修改源代码、易于更好实现)】
(3)IoC(控制反转)容器:容器主动控制