Spring框架下的控制反转(九耶-钛伦特)

控制反转与依赖注入是Spring框架的核心概念和第一大主题,它的第二大主题是面向切面编程(AOP)。既然控制反转如此重要,那么控制反转是什么?怎样编程才算做是控制反转?Spring框架是如何支持和实现控制反转的呢? 

众所周知,Spring框架是从研究对象的依赖关系开始的。对象的依赖关系体现了对象之间的横向联系,横向联系的一种形式就是将被依赖的对象定义成主体对象的属性,而且在实施依赖编程时,还需要考虑到依赖解耦;即主体对象的依赖属性的类型应该使用接口,而不是具体类。有一个例子充分说明了这一点:演说家(Speaker)依赖于翻译(Translator)进行多种语言的演讲。在这个例子中,主体对象是演说家,因此被关注和测试执行;翻译是被依赖的对象,是主体对象的支持和扩展部分,因此作为主体对象的属性。考虑到依赖解耦,首先定义接口:

 

然后定义接口的实现类;这里有2个实现类:英文翻译类和中文翻译类,用来创建2个不同的翻译对象:英文翻译和中文翻译。

 

 

再定义主体类Speaker,通过接口依赖形成和翻译对象的依赖关系:

 

上述依赖实现由于采用了接口,因此是依赖解耦的。依赖解耦的直接表现是,当演说家切换翻译进行另外一种语言演讲时,主体对象(演说家)的类代码并不需要改变。但是只有依赖解耦还是不够的,因为还是需要修改执行类中的代码,才能完成主体对象的功能切换。例如,在主方法中修改set方法重新设置依赖关系: 

 

如果要求Speaker类的执行代码(测试类中的主方法)在执行翻译切换时,不需要修改setter方法;也就是说在扩充主体对象的功能时,主体对象的代码(主体类)和它的执行代码(测试类)都不需要改变,那么如何编程呢?这就需要控制反转

分析上述测试类中的主方法代码,可以将其划分为两个部分,第一部分代码的功能是:创建对象和设置对象的依赖关系;第二部分代码是执行对象的功能。第一部分代码被称为控制权代码;一般情况下,普通编程的控制权代码是在主体对象的执行方法中。如果将控制权代码从执行方法中移除到第三方的工厂类中,对于主体对象来说就发生了控制反转。这里之所以将工厂类称之为第三方对象是因为它即不是主体对象也不是被依赖对象,而是一个居间的对象管理者。值得注意的是:发生控制反转后的主体对象由于丧失了控制权,只能在自己的执行方法中向工厂索要自己,而不是亲自创建自己和设置依赖,这就是实施控制反转后主体对象编程的主要特征。这样编程将导在改变依赖关系时,主体类代码和测试类执行方法的代码都不需要改动。参考程序如下:

控制反转后,主体对象的执行代码如下:

 

 

Spring框架就是在这种情形下引入的:既然工厂类对于实施控制反转起者非常关键的作用,那么Spring框架就定义了丰富的工厂来实现和加强控制反转。由于这些工厂可以缓存和提供对象,因此又被称为IoC容器,而IoC容器创建和管理的对象统称为Bean。Spring框架定义了IoC容器的根接口BeanFactory,规范了IoC容器的核心功能。同时又针对Java应用和JavaWeb应用定义ApplicationContext子接口和WebApplicationContext子接口。ApplicationContext接口继承了BeanFactory接口,同时又扩展了事件发布和国际化的功能。WebApplicationContext接口继承了ApplicationContext接口,在后者的基础之上扩展了Web特征的功能。

Java应用的IoC容器创建,又有2种实现技术:一种是基于xml文件的实现类:

ClassPathXmlApplicationContext;另一种是基于注解的实现类:AnnotationConfigApplicationContext。下面给出第一种的实现方案:

 

其中创建IoC容器所需要的配置文件如下:

 

Spring框架下的控制反转,包括两个方面的内容:创建对象和设置依赖关系。创建和管理对象是IoC容器的核心功能,而依赖关系的设置又被称为依赖注入。Spring框架针对依赖注入也制定了一系列的规则,比如:按名称自动装配和按类型自动装配等。由于IoC容器负责创建对象,管理对象并设置对象的依赖关系,这使得主体对象在改变依赖关系的时候,不需要修改代码,而是修改相关的配置文件或者配置对象,因此极大的提高了程序的适用性;项目的核心对象可以根据实际情况的变化,通过依赖设置,新增功能,扩展需求,并且支持依赖解耦,很好的体现了软件工程中关于开发要符合“高内聚和低耦合”的理念以及“向扩展开放,向修改关闭”的原则。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值