基本介绍
IoC同DI(依赖注入),是同一个概念不同角度的描述。IoC是不在对象中直接控制自己设计的对象,而是交给容器(比如Service对象?)。了解IoC概念,同名,我们必须了解:1.谁控制了谁的什么;2.为何反转、在哪些方面反转了。
1.谁控制了谁的什么
传统程序在程序内部通过new创建 程序/此对象 所依赖的对象对象,而IoC有专门的容器创建这些对象。即IoC容器控制对象的创建,控制了外部资源的获取(不仅限对象,也包括文件等);
2.为何反转,哪些方面反转了
正转指传统程序通过主动控制直接获取寄来的对象。反转则是由容器来创建并注入以来的对象——之所以是反转,是因为程序是被动的接受以来的对象,而容器帮程序查找及注入以来的对象。以来对象的获取被反转了。
3.传统程序和IoC程序结构对比图;
IoC思想:能做什么
IoC(控制反转)是一种思想,指导程序员设计出松耦合的程序。传统程序在类内部穿件所依赖的对象,导致类之间高耦合。IoC容器将查找和创建所依赖的对象的控制权都交给了容器,由容器进行诸如类所依赖的对象的组合。类之间是松耦合的,这样也方便测试。
IoC所谓反转就是从思想上发生了主从换位的变化——原本程序进行获取所有资源的行动,而在IoC中,应用程序则被动等待IoC创建其所以来的资源。
依赖注入实例
IoC在Spring中成为DI(Dependencies Injection),汇总《Spring实战》中部分实例并稍作拓展。
1.构造器注入
传统程序解决对象之间依赖关系为,在一个类中需要另外一个类时直接new创建。一个类中有另外一个类的具体实现,紧耦合。构造器注入为构造器传参一个所依赖的接口,不与特定的类绑定。实例如下:
//如下也展示了OO的设计原则:面向接口编程,而非具体实现
public class DarkKnight implements Knight{
private Quest quest;//Quest是接口;
public DarkKnight (Quest quest){
this.quest=quest;//这里不予具体的类绑定
}
public void embarkQuest(){
quest.embark();
}
}
而Quest与DarkKnight之间的协作——创建应用组件之间的协作,Spring中称之为装配(wiring)。Spring有三种实现的方式:
1. xml配置;
2. java配置;
3.@Autowired自动装配;
示例java配置
@Configuration
public class KnightConfig{
@Bean
public Knight knight(){
return new DarkKnight(quest());//参数类型为接口,返回类型为Knight的子类
}
@Bean
public Quest quest(){
return new XXXQuest();
}
}
拓展
spring中有多种依赖注入和装配的方式,依赖注入诸如构造器注入、set注入、静态工厂方法注入和实例注入等。装配方式最常用的有@Autowired。
@Autowired使用时,首先要创建可悲扫描的bean(使用Component注解标记类);然后启动主键扫描,使用@Configuration和@ComponentScan。
这些以后都要熟悉。