文档章节

@Autowired注解

IT-sticker
 IT-sticker
发布于 2016/04/25 15:36
字数 1727
阅读 4
收藏 0

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

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

//是否必须满足依赖性检查  
boolean required() default true; 
}


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

Java代码 复制代码  收藏代码
  1. @Autowired(required=false)     
  2. private TestBean2 testBean2;     
  3.   
  4. @Autowired    
  5. private TestBean3 testBean3;  
@Autowired(required=false)  
private TestBean2 testBean2;  

@Autowired 
private TestBean3 testBean3;


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

Java代码 复制代码  收藏代码
  1. <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>   
  2. <bean id="testBean1" class="test.TestBean1"/>     
  3.   
  4. <bean id="testBean2" class="test.TestBean2"/>     
  5.   
  6. <bean id="testBean3" class="test.TestBean3"/>    
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<bean id="testBean1" class="test.TestBean1"/>  

<bean id="testBean2" class="test.TestBean2"/>  

<bean id="testBean3" class="test.TestBean3"/>

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

Java代码 复制代码  收藏代码
  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;     
  9. }   
@Autowired(required=false)  
public void setTestBean2(TestBean2 testBean2) {  
    this.testBean2 = testBean2;  
}  

@Autowired 
public void setTestBean3(TestBean3 testBean3) {  
   this.testBean3 = testBean3;  
}

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

Java代码 复制代码  收藏代码
  1. @Autowired(required=false)     
  2. public TestBean1(TestBean2 tb2, TestBean3 tb3) {   
  3.     this.testBean2 = tb2;    
  4.     this.testBean3 = tb3;     
  5. }  
@Autowired(required=false)  
public TestBean1(TestBean2 tb2, TestBean3 tb3) {
    this.testBean2 = tb2; 
    this.testBean3 = tb3;  
}

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

Java代码 复制代码  收藏代码
  1. @Autowired    
  2. public void preparedBean(TestBean2 tb2, TestBean3 tb3){     
  3.     this.testBean2 = tb2;     
  4.     this.testBean3 = tb3;     
  5. }  
@Autowired 
public void preparedBean(TestBean2 tb2, TestBean3 tb3){  
    this.testBean2 = tb2;  
    this.testBean3 = tb3;  
}

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


Java代码 复制代码  收藏代码
  1. @Autowired    
  2. private ApplicationContext ac;   
@Autowired 
private ApplicationContext ac;


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

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

5.6.5  细粒度控制Autowiring策略

当多个协作者满足autowire注入条件时,我们可以启用<bean/>元素的primary属性,从而避免异常的抛出。但是,primary属性不能够满足企业级应用的复杂需求,比如多个同一类型的不同协作者需要注入到同一受管Bean的时候。

下面给出了某XML配置示例。

Java代码 复制代码  收藏代码
  1. <bean id="testBean2a" class="test.TestBean2"/>     
  2.   
  3. <bean id="testBean2b" class="test.TestBean2"/>     
  4.   
  5. <bean id="testBean2c" class="test.TestBean2"/>   
<bean id="testBean2a" class="test.TestBean2"/>  

<bean id="testBean2b" class="test.TestBean2"/>  

<bean id="testBean2c" class="test.TestBean2"/>

现在希望将它们分别注入到下面给出的属性中。显然,启用primary属性是不行的,因为一旦启用它,testBean2a、testBean2b、testBean2c将引用到同一受管Bean中。


Java代码 复制代码  收藏代码
  1. @Autowired 2.private TestBean2 testBean2a;     
  2.   
  3. @Autowired    
  4. private TestBean2 testBean2b;     
  5.   
  6. @Autowired    
  7. private TestBean2 testBean2c;   
@Autowired 2.private TestBean2 testBean2a;  

@Autowired 
private TestBean2 testBean2b;  

@Autowired 
private TestBean2 testBean2c;

为此,我们需要启用<qualifier/>元素及@Qualifier注解。调整后的XML配置示例如下。

Java代码 复制代码  收藏代码
  1. <bean id="testBean2a" class="test.TestBean2">     
  2.     <qualifier value="2a"/>     
  3. </bean>     
  4.   
  5. <bean id="testBean2b" class="test.TestBean2">     
  6.     <qualifier value="2b"/>     
  7. </bean>     
  8.   
  9. <bean id="testBean2c" class="test.TestBean2">     
  10.     <qualifier value="2c"/>     
  11. </bean>   
<bean id="testBean2a" class="test.TestBean2">  
    <qualifier value="2a"/>  
</bean>  

<bean id="testBean2b" class="test.TestBean2">  
    <qualifier value="2b"/>  
</bean>  

<bean id="testBean2c" class="test.TestBean2">  
    <qualifier value="2c"/>  
</bean>

相应地,属性的定义也需要作相应的调整,下面给出了代码示例。各个@Qualifier注解分别指定了待注入的受管Bean,比如"2a"表示要注入<qualifier/>的value属性取值为"2a"的目标受管Bean。

Java代码 复制代码  收藏代码
  1. @Autowired    
  2. @Qualifier("2a")     
  3. private TestBean2 testBean2a;     
  4.   
  5. @Autowired    
  6. @Qualifier("2b")     
  7. private TestBean2 testBean2b;    
  8.   
  9. @Autowired 10.@Qualifier("2c")     
  10. private TestBean2 testBean2c;  
@Autowired 
@Qualifier("2a")  
private TestBean2 testBean2a;  

@Autowired 
@Qualifier("2b")  
private TestBean2 testBean2b; 

@Autowired 10.@Qualifier("2c")  
private TestBean2 testBean2c;

@Qualifier注解能够作用于属性、参数、类、其他注解等地方,比如下面给出了参数级的使用示例。

Java代码 复制代码  收藏代码
  1. @Autowired    
  2. private void preparedBean(@Qualifier("2a") TestBean2 testBean2a, @Qualifier("2b") TestBean2 testBean2b,@Qualifier("2c") TestBean2 testBean2c) {     
  3.   
  4.     this.testBean2a = testBean2a;     
  5.     this.testBean2b = testBean2b;     
  6.     this.testBean2c = testBean2c;     
  7.   
  8. }   
@Autowired 
private void preparedBean(@Qualifier("2a") TestBean2 testBean2a, @Qualifier("2b") TestBean2 testBean2b,@Qualifier("2c") TestBean2 testBean2c) {  

    this.testBean2a = testBean2a;  
    this.testBean2b = testBean2b;  
    this.testBean2c = testBean2c;  

}

开发者还可以基于@Qualifier注解构建更复杂的Autowiring策略,下面给出了一注解示例。

Java代码 复制代码  收藏代码
  1. @Retention(RetentionPolicy.RUNTIME)     
  2. @Target({ElementType.FIELD, ElementType.PARAMETER})     
  3. @Qualifier    
  4. public @interface FineQualifier {    
  5.   
  6.     String keyFine() default "";     
  7.     String valueFine() default "";     
  8. }   
@Retention(RetentionPolicy.RUNTIME)  
@Target({ElementType.FIELD, ElementType.PARAMETER})  
@Qualifier 
public @interface FineQualifier { 

    String keyFine() default "";  
    String valueFine() default "";  
}

同使用@Qualifier注解一样,下面给出了@FineQualifier应用示例。

Java代码 复制代码  收藏代码
  1. @Autowired    
  2. @FineQualifier(keyFine="key2A", valueFine="value2A")     
  3. private TestBean2 testBean2a;     
  4.   
  5. @Autowired    
  6. @FineQualifier(keyFine="key2B", valueFine="value2B")     
  7. private TestBean2 testBean2b;     
  8.   
  9. @Autowired 10.@FineQualifier(keyFine="key2C", valueFine="value2C")   
  10.   
  11. private TestBean2 testBean2c;   
@Autowired 
@FineQualifier(keyFine="key2A", valueFine="value2A")  
private TestBean2 testBean2a;  

@Autowired 
@FineQualifier(keyFine="key2B", valueFine="value2B")  
private TestBean2 testBean2b;  

@Autowired 10.@FineQualifier(keyFine="key2C", valueFine="value2C")

private TestBean2 testBean2c;

为配合@FineQualifier注解的使用,XML配置文件也需要作相应的调整,下面给出了调整后的配置示例。

Java代码 复制代码  收藏代码
  1. <bean id="testBean2a" class="test.TestBean2">     
  2.     <qualifier type="test.FineQualifier">     
  3.         <attribute key="keyFine" value="key2A"/>     
  4.         <attribute key="valueFine" value="value2A"/>     
  5.     </qualifier>     
  6. </bean>    
  7. <bean id="testBean2b" class="test.TestBean2">     
  8.    <qualifier type="test.FineQualifier">     
  9.        <attribute key="keyFine" value="key2B"/>     
  10.        <attribute key="valueFine" value="value2B"/>    
  11.    </qualifier>     
  12. </bean>     
  13.   
  14. <bean id="testBean2c" class="test.TestBean2">     
  15.    <qualifier type="test.FineQualifier">     
  16.        <attribute key="keyFine" value="key2C"/>     
  17.        <attribute key="valueFine" value="value2C"/>     
  18.    </qualifier>     
  19. </bean>   
<bean id="testBean2a" class="test.TestBean2">  
    <qualifier type="test.FineQualifier">  
        <attribute key="keyFine" value="key2A"/>  
        <attribute key="valueFine" value="value2A"/>  
    </qualifier>  
</bean> 
<bean id="testBean2b" class="test.TestBean2">  
   <qualifier type="test.FineQualifier">  
       <attribute key="keyFine" value="key2B"/>  
       <attribute key="valueFine" value="value2B"/> 
   </qualifier>  
</bean>  

<bean id="testBean2c" class="test.TestBean2">  
   <qualifier type="test.FineQualifier">  
       <attribute key="keyFine" value="key2C"/>  
       <attribute key="valueFine" value="value2C"/>  
   </qualifier>  
</bean>

或者,开发者也可以启用<meta/>元素,配置示例如下。当在同一受管Bean中同时指定<qualifier/>和<meta/>元素时,DI容器会优先使用<qualifier/>。

Java代码 复制代码  收藏代码
  1. <bean id="testBean2a" class="test.TestBean2">     
  2.     <meta key="keyFine" value="key2A"/>     
  3.     <meta key="valueFine" value="value2A"/>     
  4. </bean>     
  5. <bean id="testBean2b" class="test.TestBean2">     
  6.    <meta key="keyFine" value="key2B"/>     
  7.    <meta key="valueFine" value="value2B"/>     
  8. </bean>  1011.<bean id="testBean2c" class="test.TestBean2">     
  9.    <meta key="keyFine" value="key2C"/>     
  10.    <meta key="valueFine" value="value2C"/>     
  11. </bean>  
<bean id="testBean2a" class="test.TestBean2">  
    <meta key="keyFine" value="key2A"/>  
    <meta key="valueFine" value="value2A"/>  
</bean>  
<bean id="testBean2b" class="test.TestBean2">  
   <meta key="keyFine" value="key2B"/>  
   <meta key="valueFine" value="value2B"/>  
</bean>  10. 11.<bean id="testBean2c" class="test.TestBean2">  
   <meta key="keyFine" value="key2C"/>  
   <meta key="valueFine" value="value2C"/>  
</bean>

当@FineQualifier注解没有应用类一级的@Qualifier注解时,开发者必须借助如下对象注册它。

Java代码 复制代码  收藏代码
  1. <bean id="customAutowireConfigurer" class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">     
  2.    <property name="customQualifierTypes">     
  3.        <set>     
  4.            <value>test.FineQualifier</value>     
  5.        </set>     
  6.    </property>     
  7. </bean>   

本文转载自:http://blog.csdn.net/zhejingyuan/article/details/11971371

上一篇: jquery
IT-sticker
粉丝 0
博文 85
码字总数 1862
作品 0
珠海
程序员
私信 提问
【Spring】Autowiredd原理及与Resource注解区别

Autowired注解 Autowired顾名思义,表示自动注入,如下是Autowired注解的源代码: 从Autowired的实现可以看到,Autowired可以用于类的构造方法,类的字段,类的方法以及注解类型上,但是Aut...

weknow
2018/03/06
621
0
《Spring Recipes》第一章笔记:@Autowired and @Resource

@Autowired and @Resource 问题: 在bean标签上使用autowire属性,会将bean的所有属性都设置为autowire。无法做到指定特定的属性为autowire。 解决方案 从Spring2.5开始,可以在方法、构造函...

LiJIaming
2012/05/14
2.4K
0
SpringMVC 基本注解[@Resource,@Autowired,@Component]

使用spring注解@Autowired,@Component需要先配置schema: xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/co......

chencang001
2016/03/18
594
0
Spring - @Autowired与@Resource

一、@Autowired spring2.5引入@Autowired 注解。用于对类的成员变量,方法及构造函数进行注入。取代了get、set方法: 注解形式 @Autowired             默认byType形式 @Autowir...

lemos
2016/12/13
12
0
spring-ioc-annotation

7.9基于注解的容器配置 前言:注解配置好还是xml配置好? 二者各有千秋. 注解配置:更短更简洁,缺点:配置分散,不宜管理;需要重新编译. xml配置:不直接与代码交互,易于管理;缺点:冗长 使用基于J...

流光韶逝
2016/09/19
20
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
今天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部