对于spring中IOC和DI的理解

1. 概述 IOC是一种设计思想,旨在实现调用类和实现类的松耦合,调用类只依赖接口,在编译阶段并不知道具体使用哪个实现类,而是将这个控制权交给第三方容器,在运行时由容器将实例变量(具体的实现类)注入到对象中(调用类)。
DI是具体的实现技术,是指由第三方组件负责将实例变量(实现类)传入到对象(调用类)中去。
2.IOC举例 先看一个非IOC的方式:

public interface Animal { public void perform(); }

public class Tiger implements Animal { @Override public void perform() { System.out.println("A tiger is performing!"); }@Override public String toString() { return "I'm a tiger"; } }

public class Zoo { private Animal animal; public Zoo() { this.animal = new Tiger(); }public void perform(){ animal.perform(); }@Override public String toString() { if (animal == null) { return null; } return animal.toString(); } }

Zoo在构造函数中自行创建了Tiger的示例,这使得Zoo和Tiger紧密地耦合在了一起,扩展性会很差(比如Zoo需要一个Lion进行表演)。
如果使用IOC的方式,Zoo没有自行创建Animal实例,而是在构造的时候把Animal实例作为构造器参数传入。代码如下:
public class Zoo { private Animal animal; // Animal被注入进来 public Zoo(Animal animal) { this.animal = animal; }public void perform(){ animal.perform(); }@Override public String toString() { if (animal == null) { return null; } return animal.toString(); } }

3.DI的两种方式 3.1构造器注入 【对于spring中IOC和DI的理解】构造器注入是在Bean构造过程中执行的

3.2 Setter注入 Setter注入是在Bean实例创建完毕之后执行,如下:
public class Zoo {private Animal animal; public Animal getAnimal() { return animal; } public void setAnimal(Animal animal) { this.animal = animal; }public void perform(){ animal.perform(); } @Override public String toString() { if (animal == null) { return null; } return animal.toString(); }}


3.3 思考
  1. Spring引入Autowire(自动装配)机制就是为了解决标签下标签或标签过多的问题
  2. 对于强依赖,可使用构造器注入,对于弱依赖,推荐使用Setter注入
4. 参考文章 http://www.importnew.com/13619.html
http://www.importnew.com/24731.html
https://my.oschina.net/u/3759357/blog/1825620

    推荐阅读