什么是控制反转(IoC)?
- 对于面向对象设计及编程的基本思想,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。
- 但是耦合关系会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。
- 为了解决对象之间的耦合度过高的问题,IoC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。
想要进一步了解什么是Ioc,请参考这位大牛的文章.
IOC的别名:依赖注入(DI)
-
2004年,Martin Fowler(马丁·福勒)探讨了同一个问题,既然IoC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IoC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IoC的方法:注入。所谓依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。
-
所以,依赖注入(DI)和控制反转(IoC)是从不同的角度的描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦。
-
简单的说就是我需要的对象,不用我来创建出来,让别人的类传对象进来,就比如这样一个方法void demo() 需要一个对象object ,但是这个对象我在方法内部不去new一个新的对象,而是通过写成需要参数对象的形式void demo(Object object) ,让其他类创建并传进来这个方法里,因为在方法内没有新建类,所以在这个运行方法时也不受这个类的影响。如果一个方法需要多个对象,而每一个对象都不由自己创建,都由其他的类传进来,那么这个方法可以独立运行,这就是依赖注入。
(因为觉得大牛写的清楚,所以在这里部分引用一下原话)
写一个简单的例子
传统方式使用其他类中的对象
代码结构图(mvc)
domain.Account
package org.csu.spring.demo.ioc.domain;
public class Account {
//一个需要使用的类
private String username;
private String password;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
persistence.AccountDAO
package org.csu.spring.demo.ioc.persistence;
public interface AccountDAO {
//定义成一个接口类
void insert();
void delete();
void update