IOC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。注:不过我喜欢称DI为IOC的一个实现

理解控制反转

将它拆开来看

1.谁控制谁

2.控制什么

3.为什么是反转

4.那些反转了

看看定义:

​ 所谓IOC,就是由Spring IOC容器来负责对象的声明周期和对象之间的关系

例子:

public class StudentDao {
	
	private JdbcTemplate jdbcTemplate;
    
    public StudentDao(JdbcTemplate jdbcTemplate){
        // 构造器
        this.jdbcTemplate = jdbcTemplate;
    }

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        // setter方式
		this.jdbcTemplate = jdbcTemplate;
	}
	
	public Student getOne() {
        //本身
        StudentDao dao = new StudentDao();
        // new一个对象返回
		return new JdbcTemplate();
	}

}

如上述例子所讲,如果我们需要某个对象,一般都是采用这种直接创建的方式(new JdbcTemplate()),我们必须要面对每个环节,同时使用完成之后我们还要负责销毁它,在这种情况下我们的对象与它所依赖的对象耦合在一起。

现在我们需要一个思考一个问题?我们每次使用的对象必须需要自己去创建吗?我们依赖对象并不是需要这个对象,而是依赖它所提供的服务(也就是这个对象里的属性或者方法),只要我们需要时,它能够及时提供它的服务而已,至于它是我们自己创建的还是别人送给我们也罢,好像不是那么重要。与其自己去创建它,还要管理与善后而言。直接有人送过来岂不美哉。

这个给我们送东西的“人”,就是IOC。它就相当与一个婚介所,它管理着许许多多的男女资料,当我们需要一个女朋友的时候,直接跟婚介所提出要求婚介公司则会根据我们的需求提供一个妹子给我们,我们只需要负责谈恋爱,生猴子就行了。你看,这样是不是很简单明了。

img

所以 IoC 就是这么简单!原来是需要什么东西自己去拿,现在是需要什么东西让别人(IOC Service Provider)送过来

现在可以回答上面的四个问题了

1.谁控制谁

​ 以前是new一个对象直接使用,也就是说你依赖的对象直接由你自己控制,现在是直接由IOC容器直接控制,谁控制谁,当然是IOC控 制对象了

2.控制什么

​ 控制对象

3.为什么是反转

​ 没有IOC的时候我们都是直接主动创建所需要依赖的对象,,这是正转,有IOC了,所依赖的对象直接由 IoC 容器创建后注入到被注入 的对象中,依赖的对象主动获取转变为被动获取

4.那些反转了

​ 所依赖对象的获取方式被反转了

IOC的注入方式

IOC Service Provider 为被注入对象提供被依赖对象也有如下几种方式:构造方法注入、stter方法注入、其他注入。

构造器注入

构造器注入,顾名思义就是被注入的对象通过在其构造方法中声明依赖对象的参数列表,让外部知道它需要哪些依赖对象。

public StudentDao(JdbcTemplate jdbcTemplate){
        this.jdbcTemplate = jdbcTemplate;
    }
setter方法注入

对于JavaBean对象而言,我们一般都是通过getter和setter方法来访问和设置对象的属性,所以,当前对象只需要为其所依赖的对象提供相对应的 setter 方法,就可以通过该方法将相应的依赖对象设置到被注入对象中。

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
其他........
public class ClassA {  
  private InterfaceB clzB;  
  public void doSomething() {  
    Ojbect obj = Class.forName(Config.BImplementation).newInstance();  
    clzB = (InterfaceB)obj;  
    clzB.doIt();   
  }  

各个组件

spring-201805091002