【发布时间】:2022-01-30 10:41:56
【问题描述】:
我遇到了一个有一些奇怪的@Qualifier 行为的代码。这不是我所期望的。
让我们考虑以下代码sn-p:
@SpringBootApplication
class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
Foo foo1() {
return new Foo("foo1");
}
@Bean
Foo foo2() {
return new Foo("foo2");
}
static class Foo {
private final String name;
public Foo(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
@Component
static class Bar {
private Foo fooOne;
private Foo fooTwo;
@Autowired
@Qualifier("foo3")
void setFoo(Foo foo1, Foo foo2) {
this.fooOne = foo1;
this.fooTwo = foo2;
}
@PostConstruct
void printFoo() {
System.out.println(fooOne.getName() + fooTwo.getName());
}
}
}
上面的代码不起作用,因为没有名为foo3 的Foo bean。这正是我所期望的。现在让我们更改Foo 类定义以包含@Qualifier:
@Qualifier("foo3")
static class Foo {
// remaining code not changed..
随着这一变化,Bar::setFoo 方法上的 @Qualifier 似乎被忽略了,foo1 和 foo2 实例被注入。上下文中不存在 ID 为 foo3 的 bean。我很难理解这里应用的机制。谁能解释一下?
【问题讨论】:
标签: java spring spring-boot dependency-injection