资源预览内容
第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
第9页 / 共11页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
SpringAutowired 注解自 Spring 诞生以来,的 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. java view plaincopy1. 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 view plaincopy1. 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 view plaincopy1. 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 view plaincopy1. 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 view plaincopy1. 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 view plaincopy1. 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 view plaincopy1. Autowired 2. 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 代码 1. 2. 3. 4. 5. java view plaincopy1. 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 view plaincopy1. Autowired 2.private TestBean2 testBean2a; 2. 3. Autowired 4. private TestBean2 testBean2b; 5. 6. Autowired 7. private TestBean2 testBean2c; 为此,我们需要启用元素及Qualifier 注解。调整后的 XML 配置示例如下。 Java 代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. java view plaincopy1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 相应地,属性的定义也需要作相应的调整,下面给出了代码示例。各个Qualifier 注解分别指定了待注入的受管 Bean,比如2a表示要注入的 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; java view plaincopy1. 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,
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号