gpt4 book ai didi

java - 带有 setter 注入(inject)的 Spring @Qualifier 奇怪行为

转载 作者:行者123 更新时间:2023-12-05 05:47:55 42 4
gpt4 key购买 nike

我遇到了一段代码,它有一些奇怪的 @Qualifier 行为。这不是我所期望的。

让我们考虑以下代码片段:

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

上面的代码不起作用,因为没有名为 foo3Foo bean。这正是我所期望的。现在让我们更改 Foo 类定义以包含 @Qualifier:

    @Qualifier("foo3")
static class Foo {
// remaining code not changed..

有了这个改变,Bar::setFoo 方法上的 @Qualifier 似乎被忽略了,实例 foo1foo2 被注入(inject)。上下文中不存在 ID 为 foo3 的 bean。我很难理解这里应用的机制。谁能解释一下?

最佳答案

通过将限定符放在类 Foo 上:

    @Qualifier("foo3")
static class Foo {
...
}

每个 bean 都实例化为一个类 Foo将具有给定的限定符。您是对的,不是具有 id foo3 的单个 bean ,但是有两个带有限定词的bean foo3 .

可以找到有关该主题的更多信息 here .

要注入(inject)两个 bean,删除静态类上的限定符并在两个参数上添加限定符:

  @Autowired
void setFoo(@Qualifier("foo1") Foo foo1, @Qualifier("foo2") Foo foo2) {

要在应用程序上下文中使用 bean,我建议注入(inject)应用程序上下文并检索 bean 以检查它们。例如:


@SpringBootApplication
class DemoApplication {

@Autowired
ApplicationContext context

@PostConstruct
public void init() {

// Beans by qualifier
BeanFactoryAnnotationUtils.qualifiedBeanOfType(context.getBeanFactory(), YourClass.class, "foo3");
}

...
}

关于java - 带有 setter 注入(inject)的 Spring @Qualifier 奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70913873/

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