Spring框架中Qualifier注解在构造注入时的正确位置咨询
解决Spring Bean注入歧义的@Qualifier正确用法
你的问题出在@Qualifier注解的放置位置错误——它不能直接放在构造器上,需要标注在构造器的目标参数前,明确指定要注入的Bean名称。
正确修改方式
Spring中@Component默认生成的Bean名称是类名首字母小写(比如IceCream对应iceCream,Cake对应cake),你只需要在Desert的构造器参数前添加@Qualifier,指定要注入的Bean名称即可:
修改后的Desert类代码
@Component public class Desert implements IDesert { private ISugar sugar; // Spring 4.3+可以省略@Autowired,构造器注入默认生效 public Desert(@Qualifier("iceCream") ISugar sugar) { this.sugar = sugar; } @Override public void addSugar() { sugar.addSugar(); } @Override public void eatDesert() { System.out.println("Eating desert"); } }
如果需要注入Cake,只需要把@Qualifier的参数改成"cake"即可。
进阶自定义Bean标识
你也可以给ISugar的实现类自定义标识,配合@Qualifier使用,让代码更具可读性:
- 给实现类添加
@Qualifier注解
@Component @Qualifier("iceCreamSugar") public class IceCream implements ISugar { // 方法不变 }
- 注入时使用自定义标识
public Desert(@Qualifier("iceCreamSugar") ISugar sugar) { this.sugar = sugar; }
为什么之前放在构造器上无效
@Qualifier的作用是缩小Bean的匹配范围,它需要明确绑定到具体的注入参数上。直接放在构造器上时,Spring无法确定你要指定哪个参数对应的Bean,因此不会生效。
内容的提问来源于stack exchange,提问作者Payel Senapati
相关产品推荐
相关产品推荐

