gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:22:17 25 4
gpt4 key购买 nike

我正在尝试使用 进行构造函数注入(inject)@Autowired @限定符 在 Spring 5。

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

配置类
    @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。

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

有人可以说明这一点。
谢谢!!

最佳答案

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

如果您需要继续使用@Bean ,那么您需要申请 @Qualifier到方法参数。更简单,只需申请@Import(Hello.class)给您的JavaConfig让 Spring 为您解决这个问题。

关于java - 即使 @Qualifier 值在构造函数注入(inject)中不匹配,Bean 也会被注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60803749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com