反向控制也称为依赖注入,是一种降低对象耦合的设计思想。一般在分层体系结构中都是上层调用下层,调用者依赖被调用者。通过IoC的方式,可以使上层不再依赖下层接口。它通过注入一个实例化对象达到解耦的目的。使用这种方法的对象不会被显式调用,而是由IoC容器提供。
对于实现基类的不同实现类问题,AbstractClass c1=new SubClassA()能够完成功能。但问题在于换用其它基类实现类如SubClassB时代码需要大量改动。
较好的办法是用工厂设计模式将创建对象的行为包装起来,获取业务类只需要调用Factory.getClass()获取。具体由哪个实现类创建对象,的代码写在Factory中。当更换业务类中需要重写Factory的逻辑即可。
最好的办法是采用Ioc的设计思想,由Spring容器配置文件创建调用者对象,然后把被调用者对象的实例通过”构造注入”或”set注入”到调用者对象。
SpringConfig.xml配置文件(构造注入的方式):
<beans>
<bean id="transfer" class="TransferClass" singleton="false">
<constructor-arg>
<ref bean="abstract" />
</constructor-arg>
</bean>
<bean id="abstract" class="AbstractClass" sinleton="false" />
</beans>
业务类代码:
public class TransferClass {
private AbstractClass c1;
public TransferClass(AbstractClass c1){
this.c1=c1;
}
//使用c1的代码
}
使用调用类的代码:
ApplicationContext ac=new FileSystemXmlApplicationContext("SpringConfig.xml");
TransferClass tc=(TransferClass)ac.getBean("abstract");
Ioc反射控制的优点:
1) 无需关心对像的创建,只需要修改配置文件就能完成实现类的替换。
2) 通过配置文件能知道注入的实例对象,易于测试。
Ioc反射控制的缺点:创建对象的过程变复杂了,且通过反射机制实例化对象性能有所下降。