浅尝IOC模型

上周日第一次听说了IOC模型这个概念,觉得很感兴趣,便回去后又了解了一番。

IOC(Inversion of Control),中文译为控制反转,其基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。个人觉得有点像设计模式中的“工厂模式”,我们只需提出需求,提供接口即可。
IOC,又有被称为“依赖倒置原理”("Dependency Inversion Principle") 和”依赖注入“(”dependence injection“),其原理是基于OO设计原则的The Hollywood Principle:Don't call us, we'll call you(别找我,我会来找你的)。也就是说,所有的组件都是被动的,所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容器负责管理。简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。

从网上看到一个例子,觉得十分通俗易懂,在此借鉴一番以助理解。假设有一个Person类,一个Car类。例如说Person的drive方法需要引用Car,则Person类依赖于Car类,即Person的对象boy依赖Car的对象BMW。不用依赖注入原则,一般调用方法为:
Public Person{
public void drive(){
Car bmw=new Car("BMW");
bmw.挂档;
bmw.踩油门;
bmw.打方向;
}
}
这其中的关系,就导致了对象boy需要负责对象bmw的创建与调用,甚至是销毁,如此高耦合且不易修改的方法当然不是我们乐于使用的。借鉴”依赖倒置“和”依赖注入“的思想,尽量将具体类之间的依赖,转换为抽象依赖,使类Person依赖于抽象类ICar,而不是具体类Car,而BMW类只是ICar接口类的一个具体实现,则调用方法变为:
Public Person{
private ICar car;
public Person(ICar onecar){
car=onecar;
}
public void drive(){
car.挂档;
car.踩油门;
car.打方向;
}
}
这个时候,进行注入并且调用的过程,就很简单了:
BMW bmw=new BMW();
Person boy=new Person(bmw);
boy.drive();

而在Spring提供的IoC容器中,我们对这个例子中的依赖注入将会有更明了的理解。Spring中其实主要通过两个概念来实现IoC,首先通过XML配置文件,将对象和依赖对象都配置到某个XML文件中,当然该XML文件需要符合Spring指定的规范,然后通过架构中的BeanFactroy类,来自动实现上文所述注入过程,还是以boy与bmw为例,如下:
首先,Person类还是一样的,
然后xml配置文件增加点东西-(假定为bean.xml):
<?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="BMW"> <!-- BMW类是ICar的一个实现-->
</bean>
<bean id="onePerson" class="Person"> <!--本例以属性方式注入为例 -->
<property name="car">
<ref bean="oneCar"></ref>
</property>
</bean>
</beans>
最后,调用的过程,就变成如下:
BeanFactory factory=new XmlBeanFactory("bean.xml");
Person boy=(Person )factory.getBean("onePerson");
boy.drive();

通过这种方式,drive方法的调用对象决定权更是不在类文件中,可由XML外部轻松修改,解决高耦合的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值