尽管 @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 为您解决这个问题。
我正在尝试在 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 为您解决这个问题。