首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
@Autowired注解(转)
时间:
2016-10-04 20:51:05
阅读:
149
评论:
0
收藏:
0
[点我收藏+]
标签:
5.6.4 @Autowired注解 自Spring诞生以来,
的autowire和dependency-check属性便一直存在。当JDK 5.0正式发布后,Spring针对dependency-check属性引入了对应的@Required。同理,它针对autowire属性引入了对应的@Autowired注解,其定义摘录如下。 Java代码 收藏代码 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD}) public @interface Autowired { //是否必须满足依赖性检查 boolean required() default true; } @Autowired注解能够作用于构建器、属性、方法。这里的方法不局限于设值方法,即setter方法,常见的各种方法都可以应用这一注解。比如,位于autowiringdemo项目中的TestBean1类的testBean2和testBean3属性应用了这一注解,具体如下。 Java代码 收藏代码 @Autowired(required=false) private TestBean2 testBean2; @Autowired private TestBean3 testBean3; 为启用这一注解,AutowiredAnnotationBeanPostProcessor必须定义在XML配置文件中,示例如下,摘自autowired.xml。运行时,testBean2和testBean3受管Bean会自动注入到testBean1中。开发者是否注意到@Autowired暴露的required属性,这是承担着依赖性检查任务的重要属性。默认时,凡是应用了@Autowired注解的属性和方法都必须找到合适的协作者,否则DI容器会抛出异常,通过调整required属性取值能够改变这一行为。 Java代码 收藏代码
下面给出了应用于设值方法的@Autowired注解。 Java代码 收藏代码 @Autowired(required=false) public void setTestBean2(TestBean2 testBean2) { this.testBean2 = testBean2; } @Autowired public void setTestBean3(TestBean3 testBean3) { this.testBean3 = testBean3; } 下面给出了应用于构建器的@Autowired注解。 Java代码 收藏代码 @Autowired(required=false) public TestBean1(TestBean2 tb2, TestBean3 tb3) { this.testBean2 = tb2; this.testBean3 = tb3; } 下面给出了应用于普通方法的@Autowired注解。 Java代码 收藏代码 @Autowired public void preparedBean(TestBean2 tb2, TestBean3 tb3){ this.testBean2 = tb2; this.testBean3 = tb3; } 除了能够自动注入普通受管Bean外,@Autowired注解还能够注入一些特殊对象,比如受管Bean所在DI容器中的各种元数据对象,示例如下。@Autowired将当前DI容器注入。 Java代码 收藏代码 @Autowired private ApplicationContext ac; 在@Autowired的required属性与@Required注解间进行取舍 @Required是专门用于依赖性检查的注解,而@Autowired注解的required属性也能够用来承担依赖性检查工作。一旦@Required应用到目标设值方法,则DI容器必须成功调用这一设值方法,@Required注解才认为依赖性条件得到满足,否则将抛出异常。相比之下,当我们将@Autowired注解的required属性设置为false时,即使未找到合适的协作者,异常都始终不会被抛出。 5.6.5 细粒度控制Autowiring策略 当多个协作者满足autowire注入条件时,我们可以启用
元素的primary属性,从而避免异常的抛出。但是,primary属性不能够满足企业级应用的复杂需求,比如多个同一类型的不同协作者需要注入到同一受管Bean的时候。 下面给出了某XML配置示例。 Java代码 收藏代码
现在希望将它们分别注入到下面给出的属性中。显然,启用primary属性是不行的,因为一旦启用它,testBean2a、testBean2b、testBean2c将引用到同一受管Bean中。 Java代码 收藏代码 @Autowired 2.private TestBean2 testBean2a; @Autowired private TestBean2 testBean2b; @Autowired private TestBean2 testBean2c; 为此,我们需要启用
元素及@Qualifier注解。调整后的XML配置示例如下。 Java代码 收藏代码
相应地,属性的定义也需要作相应的调整,下面给出了代码示例。各个@Qualifier注解分别指定了待注入的受管Bean,比如"2a"表示要注入
的value属性取值为"2a"的目标受管Bean。 Java代码 收藏代码 @Autowired @Qualifier("2a") private TestBean2 testBean2a; @Autowired @Qualifier("2b") private TestBean2 testBean2b; @Autowired 10.@Qualifier("2c") private TestBean2 testBean2c; @Qualifier注解能够作用于属性、参数、类、其他注解等地方,比如下面给出了参数级的使用示例。 Java代码 收藏代码 @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代码 收藏代码 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.PARAMETER}) @Qualifier public @interface FineQualifier { String keyFine() default ""; String valueFine() default ""; } 同使用@Qualifier注解一样,下面给出了@FineQualifier应用示例。 Java代码 收藏代码 @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代码 收藏代码
或者,开发者也可以启用
元素,配置示例如下。当在同一受管Bean中同时指定
和
元素时,DI容器会优先使用
。 Java代码 收藏代码
10. 11.
当@FineQualifier注解没有应用类一级的@Qualifier注解时,开发者必须借助如下对象注册它。 Java代码 收藏代码
test.FineQualifier
@Autowired注解(转)
标签:
原文地址:http://www.cnblogs.com/shuaiandjun/p/5931101.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!