控制反转&依赖注入英文是(Inverse Of Control & Dependency Injection)
控制反转:
组件的依赖关系的创建和管理置于程序外部的技术。
设计好的类,关联关系由IOC控制,不在类内部控制
对象的创建和获取提取的到外部。
依赖注入:
组件依赖外界注入,不需要再类中new出来
实现了更加灵活的编程,实现了最佳松耦合,实现组建可拔插
例如:
控制反转前:
public class UserAction {
private UserDao userDao = new UserDaoImpl(); //UserDao 只是接口,他的实例对象要有自己重建
public String add(){
User user = new User(0, "三","tiananmen", 23);
userDao.save(user); // 在这里使用的是 new UserDaoImpl() ,不便之处是实现类修改了这里要被修改,而依赖注入后,只需要修改配置文件或注解
return null;
}
控制反转后:
@Component(value="userAction")
public class UserAction {
@Resource(name="udao")
private UserDao userDao; //UserDao 只是接口 //他的实现从外界注入,可以注入任意的他的实现类,而这里的代码不需要改动。既依赖注入
public String add() {
User user = new User(0, "三","tiananmen", 23);
userDao.save(user); //在这里没用实例化userDao,new的权利给了Ioc容器 return null;
}
控制反转和依赖注入的关系:
控制反转和依赖注入其实是一回事儿,只是谈的角度不同。控制反转可以从类的角度出发,他把控制权(如他的属性的初始化的权利)交给了容器,由容器管理;依赖注入可以从这个被“抛弃的”属性的角度理解,他需要容器注入。
举个小例子:人遭到病毒袭击的时候会由免疫系统处理病毒,在病毒不是很厉害,变种不多的时候,我们可以通过自身的免疫系统产生免疫细胞把病毒处理掉。但是病毒多了,每个季节的流感病毒都有变种,(就像需求发生变化),人自身的免疫系统已经应付不过来了,就要把产生免疫能力交给医生,医生就是IOC容器,他能给你不同的药物,产生(new出)不同的免疫。这个new的过程不用人的免疫系统做了,产生免疫的能力交给医生,这就是控制反转。对于免疫来说,他现在不用人的免疫系统直接new了,而是依赖容器注入了,就是依赖注入。
也就是说控制反转是从宏观的、抽象的、类的角度说的,依赖注入是从其微观的、具体的、对象和对象的属性角度来说的。而说的是同一件事儿:类中的关联的对象控制权(new的权利)交给了IOC容器.