我正在 Spring 5 中尝试使用 @Autowired 和 @Qualifier 进行构造函数注入(inject)。
public class A {
private int a;
public void setA(int a) {
this.a = a;
}
@Override
public String toString() {
return "A [a=" + a + "]";
}
}
同学们好
public class Hello {
private A aobj;
@Autowired
public Hello(@Qualifier("a01") A aobj) {
this.aobj = aobj;
}
public void show() {
System.out.println("aobj : " + aobj);
}
}
配置类
@Configuration
public class JavaConfig {
@Bean(name = "a02")
public A createA1() {
A ob = new A();
ob.setA(199);
return ob;
}
@Bean
public Hello hello(A aobj) {
return new Hello(aobj);
}
}
主类
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);
System.out.println("--------Spring Container is ready----------");
Hello hello = (Hello)ctx.getBean("hello");
hello.show();
}
输出:
--------Spring Container is ready----------
aobj : A [a=199]
我故意为 Config 类中的 Bean 名称提供了错误的值(a02),该值与 Hello 类中的 @Qualifier 值(a01)不同。
因此,我观察到 Bean A 已成功注入(inject) Hello Bean 中。
理想情况下它应该通过错误,因为在容器中没有找到名为a01的预期匹配bean,否则在该用例中@Qualifier有什么用。
有人能解释一下吗? 谢谢!!
最佳答案
这里的问题是您在创建 Hello
bean 时没有使用 Autowiring !相反,您正在编写自己的工厂方法 hello
并自己直接调用构造函数。 @Qualifier
是容器在实例化类时读取的注释,而不是内置到构造函数本身中的某种验证(就像某些工具可以使用 @Nonnull
所做的那样) .
如果您需要继续使用@Bean
,则需要将@Qualifier
应用于方法参数。更简单的是,只需将 @Import(Hello.class)
应用于您的 JavaConfig
并让 Spring 为您解决这个问题。
关于java - 即使 @Qualifier 值在构造函数注入(inject)中不匹配,Bean 也会被注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60803749/