gpt4 book ai didi

java - 使用注释将 bean 集合注入(inject)到构造函数

转载 作者:行者123 更新时间:2023-11-30 03:54:44 25 4
gpt4 key购买 nike

我正在开发基于 spring 的项目,我们使用构造函数注入(inject)并使用 @Configuration 配置上下文。

这是显示我的问题的简化示例。

我有一个 MyMainBean 引用 Foo beans 的集合:

public class MyMainBean {
private Collection<Foo> foos;
public MyMainBean(Collection<Foo> foos) {
this.foos = foos;
}
}

这是 bean Foo:

public class Foo {
private final String name;
public Foo(String name) {
this.name = name;
}
public void foo(String arg) {
System.out.println("foo (" + name + "): " + arg);
}
}

配置类如下所示:

@Configuration
public class AppConfig {
@Bean
public MyMainBean myMain(Collection<Foo> foos) {
return new MyMainBean(foos);
}

@Bean
public Collection<Foo> foos() {
System.out.println("foos");
return Arrays.asList(new Foo("colletion1"), new Foo("colletion2"));
}
}

当我运行此命令时,我收到异常消息:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.hello.impl.Foo] found for dependency [collection of com.hello.impl.Foo]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

该消息非常清楚,因此尽管这不是我需要的,但我在 AppConfig 中添加了以下方法:

@Bean
public Foo foo1() {
System.out.println("foo1");
return new Foo("single1");
}

和类似的foo2()

现在上下文运行并且 bean 已连接。但是,尽管 foo1()foo2()foos() 被称为 MyAppBean 在其构造函数集合中接收包含由 foo1()foo2() 创建的 2 个元素。

我想让 foos() 工作,因为在我的真实代码中,类似的方法使用配置动态检索 Foo 列表。我相信这里缺少一些神奇的注释,因为我可以使用 context.xml 创建 bean 列表,但我必须在此处使用以编程方式创建的上下文。

作为一种解决方法,我可以创建 FooFactory bean,它将公开方法 getFoos() 并将该工厂连接到 MyMain,但这看起来很难看。有更好的解决办法吗?

备注

  1. 尝试添加@Qualifier没有帮助
  2. 尝试使用 @Autowire@Resource 而不是构造函数注入(inject)也没有帮助。

最佳答案

由于两个 @Bean 都是在同一个 AppConfig 中声明的,因此您可以解决您的问题,如下所示:

 @Bean
public MyMainBean myMain() {
return new MyMainBean(foos());
}

如果有不同的 @Configuration 类,@Resource 就会派上用场:

@Resource(name="foos")
private Collection<Foo> foos;

即使使用@Qualifier@Autowire在这种情况下也没有帮助。

关于java - 使用注释将 bean 集合注入(inject)到构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23512365/

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