一,为何会出现依赖注入这个概念?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
的实现类。即UserRegister
对UserDao
的依赖关系由容器注入,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框架使用依赖注入做为实现控制反转的方式,可是控制反转还有其余的实现方式,因此不能将控制反转和依赖注入等同。
六,总结