我的理解控制反转(IoC)与依赖注入(DI)

一,为何会出现依赖注入这个概念?spring

 控制反转(IoC=Inversion of Control),是一种思想,指的是控制权的转移,即(依赖)控制权由应用代码中转到了第三方外部容器(如Spring容器)设计模式

二,Spring-IoC容器app

  对于 Spring 框架来讲,所谓 IoC就是由 Spring 来负责控制对象的生命周期和对象间的关系, 用 XML 来定义生成对象的模式。框架

  在一个对象中,若是要使用另外的对象,就必须获得它(本身 new 一个,或者从 JNDI 中查询一个),使用完以后还要将对象销毁(好比 Connection 等)。那么 Spring-IoC 是如何作的呢?this

  全部的类都会在 Spring 容器中登记,告诉 Spring 你是个什 么东西,你须要什么东西,而后 Spring 会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其余须要你的东西。全部的类的建立、销毁都由 Spring 来控制,也就是说控制对象生存周期的再也不是引用它的对象,而是 Spring 。对于某个具体的对象而言,之前是它控制其余对象,如今是全部对象都被 Spring 控制。spa

二,Spring-IoC的使用设计

  在下面例子中,咱们使用 Spring 提供的 IoC 容器来管理咱们的用户注册类。code

  UserRegister依赖于UserDao的实现类,咱们使用 IoC 容器在运行期动态的为UserRegister注入UserDao的实现类。即UserRegisterUserDao的依赖关系由容器注入,UserRegister不用关心UserDao的任何具体实现类。若是要更改用户的持久化方式,只要修改配置文件 applicationContext.xml 便可。依赖注入机制减轻了组件之间的依赖关系,同时也大大提升了组件的可移植性,这意味着,组件获得重用的机会将会更多。xml

用户注册类UserRegister的部分代码以下:对象

public class UserRegister {

    private UserDao userDao = null;//由容器注入的实例对象

    public void setUserDao(UserDao userDao){

        this.userDao = userDao;

    }

       // UserRegister的业务方法

}

在其它的UserRegister方法中就能够直接使用userDao对象了,它的实例由Spring容器主动为它建立。可是,如何组装一个UserDao的实现类到UserRegister中呢?哦,Spring 提供了配置文件来组装咱们的组件。Spring 的配置文件 applicationContext.xml 代码片段以下:

<bean id="userRegister" class="com.dev.spring.simple.UserRegister">

       <property name="userDao"><ref local="userDao"/></property>

</bean>

<bean id="userDao" class="com.dev.spring.simple.MemoryUserDao"/>

四,依赖注入

  组件的依赖关系由容器实现,那么容器如何知道一个组件依赖哪些其它的组件呢?如上面例子中,容器如何得知UserRegister依赖于UserDao呢?

  Spring的组件提供了一系列所谓的回调方法(也叫注入方法),这些注入方法会告知容器它所依赖的组件,也就是将实例变量传到另外一个对象中去。依赖注入为实现IOC思想作技术支持。

  根据注入方法的不一样,咱们能够将 IoC 分为三种形式:接口注入,值注入,构造方法注入。根据注入类型的不一样,分为:值类型注入(8大基本数据类型),引用类型注入(Dao注入Service,service注入action,也就是依赖对象注入)。

五,依赖注入与控制反转

  • 控制反转是一种思想
  • 依赖注入是一种设计模式

  IoC框架使用依赖注入做为实现控制反转的方式,可是控制反转还有其余的实现方式,因此不能将控制反转和依赖注入等同。

六,总结

  1. 控制反转是一种在软件工程中解耦合的思想,调用类只依赖接口,而不依赖具体的实现类,减小了耦合。控制权交给了容器,在运行的时候才由容器决定将具体的实现动态的“注入”到调用类的对象中。
  2. 依赖注入是一种设计模式,能够做为控制反转的一种实现方式。依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。
  3. 经过IoC框架,类A依赖类B的强耦合关系能够在运行时经过容器创建,也就是说把建立B实例的工做移交给容器,类A只管使用就能够。
相关文章
相关标签/搜索