自动装配时,当且仅有一个bean时是有效的。如果不只有一个bean能够匹配结果的话, 这种歧义性会阻碍Spring自动装配属性、 构造器参数或方法参数。更精确地说, 此时Spring会抛NoUniqueBeanDefinitionException。
当发生歧义性的时候, Spring提供了多种可选方案来解决这样的问题。 可以将可选bean中的某一个设为首选(primary) 的bean, 或者使用限定符(qualifier) 来帮助Spring将可选的bean的范围缩小到只有一个bean。
primary的bean
在声明bean的时候, 通过将其中一个可选的bean设置为首选(primary) bean能够避免自动装配时的歧义性。 当遇到歧义性的时候, Spring将会使用首选的bean, 而不是其他可选的bean。 这相当于告诉Spring这是你最希望选择的bean。
在Spring中, 可以通过@Primary来表达最喜欢的方案。 @Primary能够与@Component组合用在组件扫描的bean上, 也可以与@Bean组合用在Java配置的bean声明中。
使用XML配置bean, 同样可以实现这样的功能。 <bean>
元素有一个primary属性用来指定首选的bean:只需将其设置为true即可,即primary=”true”。
限定自动装配的bean
如果有两个或多个primary的bean,依然会产生歧义。也就是说,使用@Primary仍然无法将可选方案的范围限定到唯一一个无歧义性的选项中。它只能标示一个优先的可选方案。
Spring的限定符能够在所有可选的bean上进行缩小范围的操作, 最终能够达到只有一个bean满足所规定的限制条件。 如果将所有的限定符都用上后依然存在歧义性, 那么可以继续使用更多的限定符来缩小选择范围。而@Qualifier注解是使用限定符的主要方式。 它可以与@Autowired和@Inject协同使用, 在注入的时候指定想要注入进去的是哪个bean。 为@Qualifier注解所设置的参数就是想要注入的bean的ID。
顺便说一下,Java不允许在同一个条目上重复出现相同类型的多个注解。 如果这样做的话, 编译器会提示错误。