o) {
...
}
事实上,@Qualifier作为一个单独的注解在定制化方面提供了更多的好处。用户自定义的注解在自动装配过程中也可以起到qualifier的作用,最简单的实现方式是在运用自定义注解的同时将@Qualifier作为它的元注解。@Target({ElementType.FIELD, ElementType.PARAMETER,
ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface VetSpecialty { ... }
自定义注解可以选择包含一个值来提供通过名字匹配的功能,但更普遍的用法是将它作为“标记”注解或定义一个对qualifier过程提供一些更多含义的值。例如,下面这个摘录则描绘了一个域,它应该和通过名字匹配得到的结果中合格的对象进行自动装配。
@Autowired
@VetSpecialty("dentistry")
private Clinic dentistryClinic;
在使用XML配置来达到依赖解析的目标时,''qualifier'' 子元素可以被加注到bean定义中。在下文的组件扫描部分,我们将呈现一个可供选择的非XML方法。
id="dentistryClinic" class="samples.DentistryClinic">
type="example.VetSpecialty" value="dentistry"/>
为了避免对@Qualifier注解的任何依赖性,可以在Spring context中提供一个CustomAutowireConfigurer的bean定义并直接注册所有自定义注解类型:
<bean class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">
<property name="customQualifierTypes">
<set>
<value>example.VetSpecialty</value>
</set>
</property>
</bean>
现在,自定义修饰符被显式声明了,就不再需要@Qualifier这个元注解符了。
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface VetSpecialty { ... }
其实,在配置AutowiredAnnotationBeanPostProcessor的时候,取代@Autowired注解都是有可能的。
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">
name="autowiredAnnotationType" value="example.Injected"/>
Spring 2.5的新特性:配置简化和基于注解的功能(5)
时间:2011-03-05 InfoQ中文站 沙晓兰
大部分情况下,定义自定义‘标记’注解的能力结合通过名字或其他文法值进行匹配选项,足以完成自动装配过程的细粒度控制。但Spring还支持在qualifier注解上任意数目的任意属性。比如,下面是一个极为细粒度修饰的例子。
@SpecializedClinic(species="dog", breed="poodle")
private Clinic poodleClinic;
自定义修饰符的实现应该定义这些属性:
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface SpecializedClinic {
String species();
String breed();
}
自定义修饰符属性可以匹配那些XML中bean定义的qualifier注解的属性子元素。这些元素通常以键/值对方式提供。
id="poodleClinic" class="example.PoodleClinic">
type="example.SpecializedClinic">
key="species" value="dog"/>
key="breed" value="poodle"/>
目前为止,关于autowire的描述都只是针对单独的实例,其实也支持集合。在任何需要得到所有context中某种特定类型 |