处理自动装配的歧义
自动装配@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; }