SpringAutowired注解.docx
- 文档编号:24369190
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:16
- 大小:25.32KB
SpringAutowired注解.docx
《SpringAutowired注解.docx》由会员分享,可在线阅读,更多相关《SpringAutowired注解.docx(16页珍藏版)》请在冰豆网上搜索。
SpringAutowired注解
Spring@Autowired注解
自Spring诞生以来,
当JDK5.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.}
[java] viewplaincopy
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属性应用了这一注解,具体如下。
Java代码
1.@Autowired(required=false)
2.private TestBean2 testBean2;
3.
4.@Autowired
5.private TestBean3 testBean3;
[java] viewplaincopy
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属性取值能够改变这一行为。
Java代码
1.
2.
3.
4.
5.
6.
[java] viewplaincopy
1.
2.
3.
4.
5.
6.
下面给出了应用于设值方法的@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.}
[java] viewplaincopy
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注解。
Java代码
1.@Autowired(required=false)
2.public TestBean1(TestBean2 tb2, TestBean3 tb3) {
3. this.testBean2 = tb2;
4. this.testBean3 = tb3;
5.}
[java] viewplaincopy
1.@Autowired(required=false)
2.public TestBean1(TestBean2 tb2, TestBean3 tb3) {
3. this.testBean2 = tb2;
4. this.testBean3 = tb3;
5.}
下面给出了应用于普通方法的@Autowired注解。
Java代码
1.@Autowired
2.public void preparedBean(TestBean2 tb2, TestBean3 tb3){
3. this.testBean2 = tb2;
4. this.testBean3 = tb3;
5.}
[java] viewplaincopy
1.@Autowired
2.public void preparedBean(TestBean2 tb2, TestBean3 tb3){
3. this.testBean2 = tb2;
4. this.testBean3 = tb3;
5.}
除了能够自动注入普通受管Bean外,@Autowired注解还能够注入一些特殊对象,比如受管Bean所在DI容器中的各种元数据对象,示例如下。
@Autowired将当前DI容器注入。
Java代码
1.@Autowired
2.private ApplicationContext ac;
[java] viewplaincopy
1.@Autowired
2.private ApplicationContext ac;
在@Autowired的required属性与@Required注解间进行取舍
@Required是专门用于依赖性检查的注解,而@Autowired注解的required属性也能够用来承担依赖性检查工作。
一旦@Required应用到目标设值方法,则DI容器必须成功调用这一设值方法,@Required注解才认为依赖性条件得到满足,否则将抛出异常。
相比之下,当我们将@Autowired注解的required属性设置为false时,即使未找到合适的协作者,异常都始终不会被抛出。
5.6.5 细粒度控制Autowiring策略
当多个协作者满足autowire注入条件时,我们可以启用
但是,primary属性不能够满足企业级应用的复杂需求,比如多个同一类型的不同协作者需要注入到同一受管Bean的时候。
下面给出了某XML配置示例。
Java代码
1.
2.
3.
4.
5.
[java] viewplaincopy
1.
2.
3.
4.
5.
现在希望将它们分别注入到下面给出的属性中。
显然,启用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;
[java] viewplaincopy
1.@Autowired 2.private TestBean2 testBean2a;
2.
3.@Autowired
4.private TestBean2 testBean2b;
5.
6.@Autowired
7.private TestBean2 testBean2c;
为此,我们需要启用
调整后的XML配置示例如下。
Java代码
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[java] viewplaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
相应地,属性的定义也需要作相应的调整,下面给出了代码示例。
各个@Qualifier注解分别指定了待注入的受管Bean,比如"2a"表示要注入
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;
[java] viewplaincopy
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;
@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.}
[java] viewplaincopy
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.}
开发者还可以基于@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.}
[java] viewplaincopy
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.}
同使用@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;
[java] viewplaincopy
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;
为配合@FineQualifier注解的使用,XML配置文件也需要作相应的调整,下面给出了调整后的配置示例。
Java代码
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
[java] viewplaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SpringAutowired 注解