什么是依赖注入(IoC)、控制反转(DI) (二)
2011-04-07 17:25
866 查看
IoC 或者 DI 或者 ...一大堆的缩写词
依赖注入和控制反转其实是同一回事,依赖注入最典型的应用就是控制反转
不管是面向对象,还是面向过程,都需要分成许多的块,然后由这些部件协同工作完成任务
要协同工作就会产生依赖,一个方法调用另一个方法,一个对象包含另一个对象
如果对象A包含对象B的话,就需要在A里new一个B
依赖注入从具体类B里抽象出接口IB——IB的具体实现可能有很多B,B1,B2...很多种——这样A可以不用再new具体的B了,而是跟IoC容器说:我要一个IB(getBean("IB"))。然后,由容器根据配置文件来做具体的new的工作。具体new的是哪个,由配置文件从代码外部决定,要更换成B,B1,或是B2...修改配置文件就能做到,不用再改代码了
例:
假设你编写了两个类,一个是人(Person),一个是手机(Mobile)。
人有时候需要用手机打电话,需要用到手机的dialUp方法。
传统的写法是这样:
Java code
public class Person{
public boolean makeCall(long number){
Mobile mobile=new Mobile();
return mobile.dialUp(number);
}
}
也就是说,类Person的makeCall方法对Mobile类具有依赖,必须手动生成一个新的实例new Mobile()才可以进行之后的工作。
依赖注入的思想是这样,当一个类(Person)对另一个类(Mobile)有依赖时,不再该类(Person)内部对依赖的类(Moblile)进行实例化,而是之前配置一个beans.xml,告诉容器所依赖的类(Mobile),在实例化该类(Person)时,容器自动注入一个所依赖的类(Mobile)的实例。
接口:
Java code
public Interface MobileInterface{
public boolean dialUp(long number);
}
Person类:
Java code
public class Person{
private MobileInterface mobileInterface;
public boolean makeCall(long number){
return this.mobileInterface.dialUp(number);
}
public void setMobileInterface(MobileInterface mobileInterface){
this.mobileInterface=mobileInterface;
}
}
在xml文件中配置依赖关系
Java code
<bean id="person" class="Person">
<property name="mobileInterface">
<ref local="mobileInterface"/>
</property>
</bean>
<bean id="mobileInterface" class="Mobile"/>
这样,Person类在实现拨打电话的时候,并不知道Mobile类的存在,它只知道调用一个接口MobileInterface,而MobileInterface的具体实现是通过Mobile类完成,并在使用时由容器自动注入,这样大大降低了不同类间相互依赖的关系。
转:http://apps.hi.baidu.com/share/detail/14754545
依赖注入和控制反转其实是同一回事,依赖注入最典型的应用就是控制反转
不管是面向对象,还是面向过程,都需要分成许多的块,然后由这些部件协同工作完成任务
要协同工作就会产生依赖,一个方法调用另一个方法,一个对象包含另一个对象
如果对象A包含对象B的话,就需要在A里new一个B
依赖注入从具体类B里抽象出接口IB——IB的具体实现可能有很多B,B1,B2...很多种——这样A可以不用再new具体的B了,而是跟IoC容器说:我要一个IB(getBean("IB"))。然后,由容器根据配置文件来做具体的new的工作。具体new的是哪个,由配置文件从代码外部决定,要更换成B,B1,或是B2...修改配置文件就能做到,不用再改代码了
例:
假设你编写了两个类,一个是人(Person),一个是手机(Mobile)。
人有时候需要用手机打电话,需要用到手机的dialUp方法。
传统的写法是这样:
Java code
public class Person{
public boolean makeCall(long number){
Mobile mobile=new Mobile();
return mobile.dialUp(number);
}
}
也就是说,类Person的makeCall方法对Mobile类具有依赖,必须手动生成一个新的实例new Mobile()才可以进行之后的工作。
依赖注入的思想是这样,当一个类(Person)对另一个类(Mobile)有依赖时,不再该类(Person)内部对依赖的类(Moblile)进行实例化,而是之前配置一个beans.xml,告诉容器所依赖的类(Mobile),在实例化该类(Person)时,容器自动注入一个所依赖的类(Mobile)的实例。
接口:
Java code
public Interface MobileInterface{
public boolean dialUp(long number);
}
Person类:
Java code
public class Person{
private MobileInterface mobileInterface;
public boolean makeCall(long number){
return this.mobileInterface.dialUp(number);
}
public void setMobileInterface(MobileInterface mobileInterface){
this.mobileInterface=mobileInterface;
}
}
在xml文件中配置依赖关系
Java code
<bean id="person" class="Person">
<property name="mobileInterface">
<ref local="mobileInterface"/>
</property>
</bean>
<bean id="mobileInterface" class="Mobile"/>
这样,Person类在实现拨打电话的时候,并不知道Mobile类的存在,它只知道调用一个接口MobileInterface,而MobileInterface的具体实现是通过Mobile类完成,并在使用时由容器自动注入,这样大大降低了不同类间相互依赖的关系。
转:http://apps.hi.baidu.com/share/detail/14754545
相关文章推荐
- 什么是IoC和DI?什么是依赖注入和控制反转?
- 什么是依赖注入(IoC)、控制反转(DI) (一)
- (转)什么是依赖注入(IoC)、控制反转(DI)
- PHP 依赖注入(DI) 和 控制反转(IoC)
- Spring.net step by step——依赖注入(DI)和控制反转(IOC)
- 控制反转(IOC)、依赖注入(DI)之通过set方法注入
- 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。
- Spring 深入理解IOC(控制反转)和DI(依赖注入)
- 控制反转(IOC)/依赖注入(DI)理解
- (转)关于spring的两个概念:IoC(控制反转) ,DI(依赖注入)
- 依赖注入(DI)和控制反转(IoC)
- Spring框架初解一----IOC(控制反转)及DI(依赖注入)
- Spring---IOC(控制反转)和DI(依赖注入)
- 关于spring的两个概念:IoC(控制反转) ,DI(依赖注入)
- spring(3)------控制反转(IOC)/依赖注入(DI)
- Spring框架总结,控制反转(IOC),依赖注入(DI),面向切面编程(AOP)
- Spring的IOC(控制反转)和DI(依赖注入)
- 控制反转(IOC)Inversion of Control或依赖注入(DI)Dependency Injection
- 控制反转(IOC)、依赖注入(DI)之使用List、Properties注入集合
- 演进式例解控制反转(IoC)、依赖注入(DI)之一