java - 即使 @Qualifier 值在构造函数注入(inject)中不匹配,Bean 也会被注入(inject)

标签 java spring dependency-injection constructor-injection

我正在 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/

相关文章:

angularjs - 在运行时配置 angularjs 路由

java - 如何在执行 Object object = new Object() 时注入(inject)依赖项

java - 在 Spring 使用多个服务/ Controller

Java 2D 游戏无明显原因变慢

java - 更改 c3p0 版本时 jmx mbean 服务器抛出 InstanceAlreadyExistsException

java - 从父项中删除子项的 Spring Boot 问题

java - 使用 Dagger 将依赖项注入(inject)单例?

java - 从 Xmappr 更改为 BeanIO

java - Java 1.6 和 Desktop.open() 的问题

java - 在 Eclipse 中使用相同主机但不同端口运行两个 Web 应用程序