自动装配的歧义性
在spring实现自动装配依赖的过程中,一个bean所依赖的另一个bean,必须有且仅有一个与之匹配,自动装配才是有效的。
如果在spring容器中找到多个与之匹配的bean,则会抛出NoUniqueBeanDefinitonException异常。
解决歧义性的方案
1.设置首选的bean
自动装配:在声明了@Component注解的类上添加一个@Primary注解
java配置类:在声明了@Bean注解的方法上添加一个@Primary注解
XML配置文件:将<bena>
标签的primary属性设置为true
设置primary的局限性是,当容器中同时存在多个同一接口实现类声明了@Primary注解时,歧义性依然存在。
2.使用限定符
默认限定符
通过在需要注入依赖bean的地方添加@Qualifier注解,指定注入的bean。
可以和@Autowired或@Inject协同使用。
注解@Qualifier(param)中的参数就是要注入的bean的ID。
tips:@Component注解的bean默认ID就是首字母小写的类名,而java配置类中@Bean注解的bean默认的ID则是方法名。所有的bean默认的限定符就是bean的ID。
默认限定符的局限性是,其参数指定的限定符和类名之间紧耦合,当对类名做修改时,之前的限定符失效。
自定义限定符
通过在bean的声明上添加@Qualifier(param)注解,实现限定符与类名之间的解耦。
自动装配:和@Component注解的类上添加@Qualifier(param)注解,并显示的指定参数,这个参数就是为这个bean自定义的限定符。
java配置类:在@Bean注解的方法上添加@Qualifier(param)注解。
tips:使用自定义限定符时,最好把bean的限定符声明为这个bean的特征性或描述性的术语。
局限性:当多个bean具有相同特征的话,歧义性依旧存在。
自定义的限定符注解
由于@Qualifiler注解定义没有@Repeatable注解,所以不能通过在一个bean上添加多个来解决具有相同特性的歧义性。
可以通过创建自定义的限定符注解来解决这个问题,在新定义的注解中,使用@Qualifier注解来标注。
通过组合自定义的多个注解对bean标注,从来解决的存在某些相同特性bean之间的歧义性。