Spring@Autowired注解
自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 plaincopy 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] view plaincopy 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. 4. 6. [java] view plaincopy 1. 2. 4. 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 plaincopy 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] view plaincopy 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] view plaincopy 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] view plaincopy 1. @Autowired 2. private ApplicationContext ac; 在@Autowired的required属性与@Required注解间进行取舍 @Required是专门用于依赖性检查的注解,而@Autowired注解的required属性也能够用来承担依赖性检查工作。一旦@Required应用到目标设值方法,则DI容器必须成功调用这一设值方法,@Required注解才认为依赖性条件得到满足,否则将抛出异常。相比之下,当我们将@Autowired注解的required属性设置为false时,即使未找到合适的协作者,异 常都始终不会被抛出。 5.6.5 细粒度控制Autowiring策略 当多个协作者满足autowire注入条件时,我们可以启用 下面给出了某XML配置示例。 Java代码 1. 3. 5. [java] view plaincopy 1. 3. 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 plaincopy 1. @Autowired 2.private TestBean2 testBean2a; 2. 3. @Autowired 4. private TestBean2 testBean2b; 5. 6. @Autowired 7. private TestBean2 testBean2c; 为此,我们需要启用 Java代码 1. 5. 9. [java] view plaincopy 1. 5. 9. 相应地,属性的定义也需要作相应的调整,下面给出了代码示例。各个@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] view plaincopy 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] view plaincopy 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] view plaincopy 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] view plaincopy 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. 7. 14. 18. [java] view plaincopy 1. 7. 14. 或者,开发者也可以启用元素,配置示例如下。当在同一受管Bean中同时指定 Java代码 1. 5. 8. [java] view plaincopy 1. 5. 8. 当@FineQualifier注解没有应用类一级的@Qualifier注解时,开发者必须借助如下对象注册它。 Java代码 1. 4. 因篇幅问题不能全部显示,请点此查看更多更全内容