Spring中@Qualifier注解搭配@Autowired注入失效问题求助
Spring中@Qualifier注解搭配@Autowired注入失效问题求助
嘿,我来帮你排查这个问题!你遇到的这个异常其实是Spring注入逻辑的优先级导致的,咱们一步步理清楚:
问题根源
你的A类里同时存在构造函数注入和字段注入两种方式:
- 字段上标注了
@Autowired + @Qualifier("b2"),指定要注入b2这个实例 - 但你还写了一个带
B参数的构造函数public A(B b)
Spring在这种场景下会优先选择构造函数注入,而你的构造函数参数上并没有标注@Qualifier来指定具体要注入哪个B实例,所以Spring扫描到两个B类型的bean(b1和b2)时,就会抛出"找不到唯一匹配bean"的异常。
解决方案(任选其一即可)
方案1:给构造函数参数添加@Qualifier
把@Qualifier移到构造函数的参数上(或者同时保留字段上的注解也没问题),明确告诉Spring构造函数要注入的是b2:
public class A { private B b; @Autowired public A(@Qualifier("b2") B b) { this.b = b; } public B getB() { return b; } @Override public String toString() { return "A ["+this.b+"]"; } public void setB(B b) { this.b = b; } }
方案2:改为纯字段注入(移除带参构造或改为无参)
如果你更倾向于用字段注入的方式,可以把带参构造改成无参构造,这样Spring就会使用字段上的@Autowired + @Qualifier配置来注入b2:
public class A { @Autowired @Qualifier("b2") private B b; // 改为无参构造 public A() { } public B getB() { return b; } @Override public String toString() { return "A ["+this.b+"]"; } public void setB(B b) { this.b = b; } }
方案3:XML配置中指定构造参数(不推荐,注解方式更统一)
如果你想保留构造函数,也可以在config.xml里给A的bean指定构造参数,直接指向b2:
<bean class="com.springcore.autowiring.annotation.A" name="ObjA"> <constructor-arg ref="b2"/> </bean>
修改后再运行,Spring就能准确找到你要注入的b2实例,不会再抛出异常啦!
备注:内容来源于stack exchange,提问作者Sourabh Bidikar
相关产品推荐
相关产品推荐

