处理自动装配的歧义

自动装配@autowired的时候,如果找到的类型匹配的bean的数量不唯一(比如实现了同一个接口的多个类),就会报出bean不唯一的异常,可以使用两种方法解决:

1,设置bean的首选项,

2,使用限定符(qualifier)来帮助Spring把bean限定在只有一个

一、设置首选项

对于自动检查的或者是java代码显示声明的,使用@Primary指定

对于xml显示声明的,<bean id="" class="" primary="true"/>

如果同一类,设置了多个首选项,那就跟没有设置一样。

二、限定符

限定符使用@Qualifier注解来实现,如果@primary的直接有多个,就需要使用限定符来解决歧义。

在@autoWired的位置增加@Qualifier("string")来限定使用哪一个类进行注入。String就是限定符的字符串。

对于每一个类而言,默认的限定符就是类名字本身(首字母变为小写),为了解决耦合问题(类名改了怎么办),我们可以指定每一个类的限定符:

在@Component和@Bean下面使用@Qualifier("string")指定类的限定符。

但是如果两个类的指定限定符一样怎么办?不能在重复在添加一个限定符了。这个时候就可以使用自定义的注解来进行限定

@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface cusAno {
}
//对于bean使用注解 @Component @cusAno
public class B implements inter{ public void play(){ System.out.println("b-play"); } }
//在自动注入的位置使用注解来限定 @Autowired @cusAno
public A(inter w) { this.b = w; }
原文地址:https://www.cnblogs.com/Coder-Pig/p/7238317.html