Spring中处理自动装配的歧义性

自动装配的歧义性

在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之间的歧义性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值