IOC Inversion of Control
思想为反转资源获取的方向 传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动地将资源推送给它管理的组件,组件所要做的仅是选择一种合适的方式来接受资源。这种行为也被称为查找的被动形式。
DI Dependency Injection IOC的另一种表述方式:即组件以一些预先定义好的方式(如setter方法)接受来自如容器的资源注入。
一个例子:
Class A{}
Class B{
private A a;
public void setA(A a){
this.a = a;
}
}
需求:从容器中获取B对象,并使B对象的a属性被赋值为容器A对象的引用
传统容器 A、B之间要构造出依赖关系需要手动创造对象
A a = getA();
B b = getB();
b.setA(a);
IOC容器
B b = getB();
不需要手动注入
IOC发展过程
一个场景:要交一个实验报告,实验报告有两种形式,pdf和HTML,它们实现了同一个接口。
- 当我需要生成一份实验报告的时候,我需要知道pdf格式、HTML格式和接口这三个类的所有实现细节,耦合度高。(不同格式的构造方法、使用方法、属性等等都可能不同,所以都需要具体实现)(是不是不使用接口就降低了一个耦合度呢 分离接口和实现以便代码复用)
- 同样的需求。采用工厂设计模式,不再关心不同格式的具体实现,将它们的创建都放到工厂方法中,然后需要创建时调用工厂方法即可。耦合度降低。
- 同样的需求。采用反转控制,不再需要工厂。容器提供所需要的对象。观察类图中的箭头方向可以看到和工厂设计模式的区别,工厂设计模式是主动的,需要什么找工厂要。反转控制则是被动的由容器注入。
类图如下