中国领先的IT技术网站
|
|

5.6.4 @Autowired注解

《精通Spring——深入Java EE开发核心技术》第5章 控制反转容器,本章将从介绍IoC背景知识入手,继而进入到BeanFactory和ApplicationContext容器的讨论之中。本节为大家介绍@Autowired注解。

作者:罗时飞来源:电子工业出版社|2010-04-08 19:24


5.6.4  @Autowired注解

自Spring诞生以来,<bean/>的autowire和dependency-check属性便一直存在。当JDK 5.0正式发布后,Spring针对dependency-check属性引入了对应的@Required。同理,它针对autowire属性引入了对应的@Autowired注解,其定义摘录如下。

  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD})  
  3. public @interface Autowired {  
  4.  
  5.     //是否必须满足依赖性检查  
  6.     boolean required() default true;  
  7.  

@Autowired注解能够作用于构建器、属性、方法。这里的方法不局限于设值方法,即setter方法,常见的各种方法都可以应用这一注解。比如,位于autowiringdemo项目中的TestBean1类的testBean2和testBean3属性应用了这一注解,具体如下。

  1. @Autowired(required=false)  
  2. private TestBean2 testBean2;  
  3.  
  4. @Autowired 
  5. private TestBean3 testBean3; 

为启用这一注解,AutowiredAnnotationBeanPostProcessor必须定义在XML配置文件中,示例如下,摘自autowired.xml。运行时,testBean2和testBean3受管Bean会自动注入到testBean1中。开发者是否注意到@Autowired暴露的required属性,这是承担着依赖性检查任务的重要属性。默认时,凡是应用了@Autowired注解的属性和方法都必须找到合适的协作者,否则DI容器会抛出异常,通过调整required属性取值能够改变这一行为。

  1. <bean class="org.springframework.beans.factory.annotation.  
  2.         AutowiredAnnotationBeanPostProcessor"/>  
  3.  
  4. <bean id="testBean1" class="test.TestBean1"/>  
  5.       
  6. <bean id="testBean2" class="test.TestBean2"/>  
  7.  
  8. <bean id="testBean3" class="test.TestBean3"/>  

下面给出了应用于设值方法的@Autowired注解。

  1. @Autowired(required=false)  
  2. public void setTestBean2(TestBean2 testBean2) {  
  3.     this.testBean2 = testBean2;  
  4. }  
  5.  
  6. @Autowired 
  7. public void setTestBean3(TestBean3 testBean3) {  
  8.     this.testBean3 = testBean3;  

下面给出了应用于构建器的@Autowired注解。

  1. @Autowired(required=false)  
  2. public TestBean1(TestBean2 tb2, TestBean3 tb3) {  
  3.     this.testBean2 = tb2;  
  4.     this.testBean3 = tb3;  

下面给出了应用于普通方法的@Autowired注解。

  1. @Autowired 
  2. public void preparedBean(TestBean2 tb2, TestBean3 tb3){  
  3.     this.testBean2 = tb2;  
  4.     this.testBean3 = tb3;  

除了能够自动注入普通受管Bean外,@Autowired注解还能够注入一些特殊对象,比如受管Bean所在DI容器中的各种元数据对象,示例如下。@Autowired将当前DI容器注入。

  1. @Autowired 
  2. private ApplicationContext ac; 

在@Autowired的required属性与@Required注解间进行取舍

@Required是专门用于依赖性检查的注解,而@Autowired注解的required属性也能够用来承担依赖性检查工作。一旦@Required应用到目标设值方法,则DI容器必须成功调用这一设值方法,@Required注解才认为依赖性条件得到满足,否则将抛出异常。相比之下,当我们将@Autowired注解的required属性设置为false时,即使未找到合适的协作者,异常都始终不会被抛出。

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢
24H热文
一周话题
本月最赞

读 书 +更多

入侵的艺术

黑客也有优劣之分。很显然对他们的奖励之一是利用黑客手段非法入侵我们公司的安全站点或个人系统。另一种奖励可能是他们的黑客行为构成了黑...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× 学习达标赢Beats耳机