尽管 @Qualifier 值在构造函数注入中不匹配,但 Bean 正在注入

Bean is getting injected eventhough @Qualifier value is not matched in Constructor Injection

我正在尝试在 Spring 5.

中使用 @Autowired@Qualifier 进行构造函数注入
    public class A {

    private int a;

    public void setA(int a) {
        this.a = a;
    }

    @Override
    public String toString() {
        return "A [a=" + a + "]";
    }
}

Class你好

    public class Hello {

    private A aobj;

    @Autowired
    public Hello(@Qualifier("a01") A aobj) {
        this.aobj = aobj;
    }

    public void show() {
        System.out.println("aobj : " + aobj);
    }
}

配置Class

    @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);
    }
}

主要Class

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 Class 中为 Bean 名称提供了错误的值 (a02),这与 @Qualifier 值 ( a01) 在你好Class.

因此,我观察到的 Bean A 已成功注入 Hello Bean。

理想情况下它应该通过错误,因为在容器中没有找到名为 a01 的预期匹配 bean,否则在该用例中 @Qualifier 的用途是什么。

有人可以解释一下吗? 谢谢!!

这里的问题是您在创建 Hello bean 时没有使用自动装配!相反,您正在编写自己的工厂方法 hello 并自己直接调用构造函数。 @Qualifier 是容器在​​实例化 class 时读取的注释,而不是构造函数本身内置的某种验证(就像某些工具可以用 @Nonnull 做的那样)。

如果您需要继续使用 @Bean,则需要将 @Qualifier 应用于方法参数。更简单的是,只需将 @Import(Hello.class) 应用到您的 JavaConfig 并让 Spring 为您解决这个问题。