依赖注入的简单理解

所谓依赖,举个例子说明,一个类Person,另外一个类Car,若是Person的某个方法好比说drive,须要引用Car,则称Person类依赖于 Car类,延伸到对象,这种依赖关系依然成立,好比说Person类的对象boy依赖于Car类的对象toyota。再讲讲这个drive方法的实现,假定代码以下:
Public Person{
...
public void drive(){
  Car toyota=new Car("TOYOTA");
  toyota.挂档;
  toyota.踩油门;
  toyota.打方向;
}
}

 


    这其中的依赖关系,就致使了对象boy须要负责对象toyota的建立,甚至是整个生命周期的管理,而这样显然会带来耦合度高,不易维护等缺点,好比说要让这个男孩驾驶一辆Audi,则还须要修改类Person的代码。
    所以在java的设计理论中就提出了一条很是著名的原则,依赖倒转原则(Dependence Inversion),其核心思想就是要将这种具体类之间的依赖,尽可能转换成抽象依赖,也就是说类Person应该依赖于抽象类ICar,而不是具体的类 Car,这里java就大力推荐了抽象和接口的使用,至于抽象和接口之间的区别,任何一本JAVA书籍都有介绍,这里就再也不说了。
    这个依赖倒转原则在设计模式也体现得很是多,好比说工厂模式和构建模式,我的认为控制反转IoC,其实也能够认为是实现这个原则的一种设计模式。控制反转,其中的控制这个词一直不太理解是什么意思,不过控制反转的另一种说法也就是依赖注入(dependence injection),我的以为更易于理解。仍是以上文的boy与toyota为例,其核心就是要将boy依赖的对象toyota注入到boy中去,而无需boy本身去引用toyota,这个注入的过程,一般是由一个控制程序来完成的,无需对象去关心,举例以下:
Public Person{
private ICar car;
public Person(ICar onecar){
  car=onecar;
}
public void drive(){
  car.挂档;
  car.踩油门;
  car.打方向;
}
}

 

    这个时候,进行注入而且调用的过程,就很简单了,以下:
Toyota toyota=new Toyota();
Person boy=new Person(toyota);
boy.drive();

 

    注:这里咱们假定,Toyota类是ICar接口类的一个具体实现。
    这个例子就演示一个最简单的注入方式的例子,也就是构造子方式注入,经过将依赖对象注入到对象的构造子中来实现。另外还有一种经常使用的注入方式,就是属性方式注入,意思就是经过将依赖对象注入到对象的属性中来实现,仍是以boy和toyota的例子说明,以下:
Public Person{
private ICar car;
public Person(){
}
public void drive(){
  car.挂档;
  car.踩油门;
  car.打方向;
}
public ICar getCar(){
  return this.car;
}
public void setCar(ICar onecar){
  car=onecar;
}
}

 

    这个时候,进行注入而且调用的过程,就变成以下所示:
Toyota toyota=new Toyota();
Person boy=new Person();
boy.setCar(toyota);
boy.drive();


    至此依赖注入的概念应该比较清楚了,再来看看在Spring中如何实现IoC的,看看Spring如何做为一个成熟的IoC容器,Spring中其实主要经过两个概念来实现IoC,首先经过XML配置文件,将对象和依赖对象都配置到某个XML文件中,固然该XML文件须要符合Spring指定的规范,而后经过架构中的BeanFactroy类,来自动实现上文所述注入过程,仍是以boy与toyota为例,以下:
首先,Person类仍是同样的,
而后xml配置文件增长点东西-(假定为bean.xml):
html

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   <bean id="oneCar" class="Toyota"> <!-- Toyota类是ICar的一个实现-->
   </bean>
   <bean id="onePerson" class="Person"> <!--本例以属性方式注入为例 -->
       <property name="car"> 
           <ref bean="oneCar"></ref>
       </property>
   </bean>
</beans>

 

 

最后,调用的过程,就变成以下:
java

BeanFactory factory=new XmlBeanFactory("bean.xml");
Person boy=(Person )factory.getBean("onePerson");
boy.drive();


--不知是否讲清楚了,呵呵
spring

参考资料:http://www.javago.net/spring/26.html 回答者: szmneo| 
依赖注入:并非那么复杂.
A类和B类,若是A要用到B
在A类中加一个setB()就OK了,再经过spring的IOC容器实例化好的对象用属性注入就OK了
设计模式

相关文章
相关标签/搜索