读书人

运用 Spring 2.5 注释驱动的 IoC

发布时间: 2012-10-08 19:54:56 作者: rapoo

使用 Spring 2.5 注释驱动的 IoC
转自:http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/使用 Spring 2.5 注释驱动的 IoC 功能运用 Spring 2.5 注释驱动的 IoC运用 Spring 2.5 注释驱动的 IoC运用 Spring 2.5 注释驱动的 IoC运用 Spring 2.5 注释驱动的 IoC<script type="text/javascript"></script>运用 Spring 2.5 注释驱动的 IoC运用 Spring 2.5 注释驱动的 IoC

打印本页

<noscript></noscript><script type="text/javascript"></script>运用 Spring 2.5 注释驱动的 IoC运用 Spring 2.5 注释驱动的 IoC

将此页作为电子邮件发送

<noscript></noscript><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

级别: 初级

陈 雄华 (quickselect@163.com), 技术总监, 宝宝淘网络科技有限公司

2008 年 2 月 28 日

基于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置 Bean、装配 Bean 的功能,您可以使用基于注释的 Spring IoC 替换原来基于 XML 的配置。本文通过实例详细讲述了 Spring 2.5 基于注释 IoC 功能的使用。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->


运用 Spring 2.5 注释驱动的 IoC
运用 Spring 2.5 注释驱动的 IoC
回页首


Car 拥有两个属性:


清单 2. Car.java

Boss 拥有 Office 和 Car 类型的两个属性:


清单 3. Boss.java

我们在 Spring 容器中将 Office 和 Car 声明为 Bean,并注入到 Boss Bean 中:下面是使用传统 XML 完成这个工作的配置文件 beans.xml:


清单 4. beans.xml 将以上三个类配置成 Bean

当我们运行以下代码时,控制台将正确打出 boss 的信息:


清单 5. 测试类:AnnoIoCTest.java

运用 Spring 2.5 注释驱动的 IoC
运用 Spring 2.5 注释驱动的 IoC
回页首


这样,当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。

按照上面的配置,Spring 将直接采用 Java 反射机制对 Boss 中的 caroffice 这两个私有成员变量进行自动注入。所以对成员变量使用 @Autowired 后,您大可将它们的 setter 方法(setCar()setOffice())从 Boss 中删除。

当然,您也可以通过 @Autowired 对方法或构造函数进行标注,来看下面的代码:


清单 8. 将 @Autowired 注释标注在 Setter 方法上

运用 Spring 2.5 注释驱动的 IoC
运用 Spring 2.5 注释驱动的 IoC
回页首


由于 office Bean 被注释掉了,所以 Spring 容器中将没有类型为 Office 的 Bean 了,而 Boss 的 office 属性标注了 @Autowired,当启动 Spring 容器时,异常就产生了。

当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false),这等于告诉 Spring:在找不到匹配 Bean 时也不报错。来看一下具体的例子:


清单 11. 使用 @Autowired(required = false)

我们在 Spring 容器中配置了两个类型为 Office 类型的 Bean,当对 Boss 的 office 成员变量进行自动注入时,Spring 容器将无法确定到底要用哪一个 Bean,因此异常发生了。

Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常:


清单 13. 使用 @Qualifier 注释指定注入 Bean 的名称

运用 Spring 2.5 注释驱动的 IoC
运用 Spring 2.5 注释驱动的 IoC
回页首


运用 Spring 2.5 注释驱动的 IoC
运用 Spring 2.5 注释驱动的 IoC
回页首


<context:annotationconfig/> 将隐式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessor 以及 equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor。

在配置文件中使用 context 命名空间之前,必须在 <beans> 元素中声明 context 命名空间。


运用 Spring 2.5 注释驱动的 IoC
运用 Spring 2.5 注释驱动的 IoC
运用 Spring 2.5 注释驱动的 IoC
回页首


这里,所有通过 <bean> 元素定义 Bean 的配置内容已经被移除,仅需要添加一行 <context:component-scan/> 配置就解决所有问题了——Spring XML 配置文件得到了极致的简化(当然配置元数据还是需要的,只不过以注释形式存在罢了)。<context:component-scan/> 的 base-package 属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。

<context:component-scan/> 还允许定义过滤器将基包下的某些类纳入或排除。Spring 支持以下 4 种类型的过滤方式,通过下表说明:


表 1. 扫描过滤方式
过滤器类型说明注释假如 com.baobaotao.SomeAnnotation 是一个注释类,我们可以将使用该注释的类过滤出来。类名指定通过全限定类名进行过滤,如您可以指定将 com.baobaotao.Boss 纳入扫描,而将 com.baobaotao.Car 排除在外。正则表达式通过正则表达式定义过滤的类,如下所示: com\.baobaotao\.Default.*AspectJ 表达式通过 AspectJ 表达式定义过滤的类,如下所示: com. baobaotao..*Service+

下面是一个简单的例子:


值得注意的是 <context:component-scan/> 配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor),因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。

默认情况下通过 @Component 定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过 @Scope 注释来达到目标,如以下代码所示:


清单 24. 通过 @Scope 指定 Bean 的作用范围

运用 Spring 2.5 注释驱动的 IoC
运用 Spring 2.5 注释驱动的 IoC
回页首


运用 Spring 2.5 注释驱动的 IoC
运用 Spring 2.5 注释驱动的 IoC
回页首


运用 Spring 2.5 注释驱动的 IoC
运用 Spring 2.5 注释驱动的 IoC
回页首

小结

Spring 在 2.1 以后对注释配置提供了强力的支持,注释配置功能成为 Spring 2.5 的最大的亮点之一。合理地使用 Spring 2.5 的注释配置,可以有效减少配置的工作量,提高程序的内聚性。但是这并不意味着传统 XML 配置将走向消亡,在第三方类 Bean 的配置,以及那些诸如数据源、缓存池、持久层操作模板类、事务管理等内容的配置上,XML 配置依然拥有不可替代的地位。



参考资料

学习
Spring 系列:Spring 框架简介:优秀的 Spring 框架入门系列,了解 Spring 框架的基本概念。

轻量级开发的成功秘诀,第 3 部分: Spring 露出水面:介绍了在 Spring 框架的轻量级 Ioc 容器。

Spring Framework 和 IBM WebSphere Application Server:Interface21 的首席执行官 Rod Johnson 和 IBM 的 WebSphere Open Source 主管 Paul Buck 讨论了 Spring Framework 通过 IBM WebSphere Application Server 认证对 Spring 和 WebSphere 产品系列的开发人员和客户有何重要意义。

Tiger 中的注释,第 1 部分: 向 Java 代码中添加元数据:解释了元数据如此有用的原因,向您介绍了 Java 语言中的注释,并研究了 Tiger 的内置注释。

Tiger 中的注释,第 2 部分: 定制注释:说明了如何创建定制注释,如何用自己的注释注解文档,并进一步定制代码。


获得产品和技术
Springframework 网站:下载 Spring 框架。

读书人网 >软件架构设计

热点推荐