您的位置:首页 > 其它

控制反转IoC(Inversion of Control)

2017-12-10 14:24 459 查看

基本介绍

  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。

  这些以后都要熟悉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 ioc