什么是IOC
IOC是Inversion of Control的缩写,大多数书籍翻译成“控制反转”。控制反转的意思是说控制权被反转了:本来由对象自己去控制,现在交给容器控制。(以前创建对象时是自己通过new的方式主动去创建,但是由于控制器被反转交给容器后,某个对象需要另一个对象时不需要通过去new的主动创建对象,而是被动的等待容器为它创建对象) 这个也称之为好莱坞原则:好莱坞原则:不要来打电话给我(导演),我会打电话给你(演员)
这里的“我”指的是资源,你就是应用系统(模块)在1983年,Richard E. Sweet 在《The Mesa Programming Environment》中提出“Hollywood Principle”(好莱坞原则)
而DI(Dependency Injection),即依赖注入,2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是哪些方面的控制被反转了呢?“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。
依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
IoC主要实现策略
- Using a service locator pattern
服务定位模式
(JavaEE定义的一种模式,获取DataSource这些东西) - Using dependency injection,for example
依赖注入
- Constructor injection
构造器注入
- parameter injection
参数注入
- Setter injection
set注入
- Interface injection
接口注入
- Constructor injection
- Using a contextualized lookup
上下文依赖查询
(有JavaBeans之类的来实现) - Using template method design pattern
模版方法模式
- Using strategy design pattern
策略模式
其实主要是通过两大类,主要的有:
依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上:容器将调用这些回调方法,从而让应用代码获得相关资源。
依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)
来自:百度百科
IoC容器的职责
- 依赖处理
- 依赖查找
- 依赖注入
- 生命周期管理
- 容器
- 托管的资料
- 配置
- 容器
- 外部化配置
- 托管的资料