Java 多个相同类型的Spring组件\Bean
我有一个基类Java 多个相同类型的Spring组件\Bean,java,spring-boot,Java,Spring Boot,我有一个基类Foo和多个继承自它的类 到目前为止,我只需要一个 所以我就这么做了: @Autowired private List<Foo> foos; @Autowired 私人名单; 但情况已经发生了变化,我希望生成每种类型的多个对象(即Foo1的x实例,Foo2的y实例等) 如何使用Spring Boot实现这一点 注意:我真的不需要将它填充到列表中 编辑: 我将进一步解释我面临的问题。每个类代表一种任务类型(它是一个可运行的)。每个任务都有固定数量的线程。我想为每个线程
Foo
和多个继承自它的类
到目前为止,我只需要一个
所以我就这么做了:
@Autowired
private List<Foo> foos;
@Autowired
私人名单;
但情况已经发生了变化,我希望生成每种类型的多个对象(即Foo1
的x
实例,Foo2
的y
实例等)
如何使用Spring Boot实现这一点
注意:我真的不需要将它填充到列表中
编辑:
我将进一步解释我面临的问题。每个类代表一种任务类型(它是一个可运行的
)。每个任务都有固定数量的线程。我想为每个线程实例化一个新对象
所以我的问题是:如何利用弹簧来实现这一目标?当我每次任务只需要一个实例时,这很容易(请参阅
列表示例)如果我正确理解了您的问题,那么您需要一个bean的多个实例,然后您需要向原型声明该bean的范围,因为默认情况下,spring将它们设置为单实例(每个容器一个bean)。要创建bean原型,只需将此注释@Scope(“PROTOTYPE”)
添加到类中。
以下是一些深入的参考:
HTHTL;博士
我提出了一个解决方案,其中包括一些工作,但在大多数情况下更干净
它使用一个工厂来保存Foo
的所有依赖项,我们使Foo
不再是一个springbean。因此,我们不依赖Spring来实例化Foo
的n
实例,相反,我们可以通过编程来决定要创建多少实例
这当然有一些优点和缺点:
赞成的意见:
- 可以通过编程方式创建
n
实例。(可通过属性设置、可计算、可注入…)
- 我们不使用spring来决定创建了多少实例
- (可能还有更多,但目前我想不出更多)
反对的论点:
- 为要创建的每种类型创建一个新类(工厂)的开销很大
实际答案
1.创建一个接口
这将用于创建类型的n
实例:
interface Factory<T> {
T create();
}
听起来很有趣。您将如何生成每个bean?假设您将这些bean注入到singleton中,此链接可能有助于进一步澄清:这有什么意义?你想实现什么?作为初学者,我想享受Spring的组件扫描功能。Foo
的每个实例都“附加”到一个线程上。这对我来说没有任何意义。@Lino,正如我解释的,每个类都是一种任务类型。每个任务都有多个线程(固定数量)。我想为每个线程“分配”一个新实例(这是一个可运行的实例)。谢谢Lino!但是是的,我同意这会让你的代码膨胀classes@yasecospring已经让您创建了比您希望的更多的类,所以这可能不是一个很大的缺点;)@yaseco实际上,在进一步研究之后,spring已经实现了类似的功能:
// Our object we want to create
class Foo {
private final Dependency1 d1;
private final Dependency2 d2;
public Foo(Dependency1 d1, Dependency2 d2){
this.d1 = d1;
this.d2 = d2;
}
// methods of foo
}
// our factory for the object
@Component
class FooFactory implements Factory<Foo>{
private final Dependency1 d1;
private final Dependency2 d2;
@Autowired
public FooFactory(Dependency1 d1, Dependency2 d2){
this.d1 = d1;
this.d2 = d2;
}
@Override
public Foo create(){
return new Foo(d1, d2);
}
}
@Service
class MyService{
private final FooFactory fooFactory;
@Autowired
public MyService(FooFactory fooFactory){
this.fooFactory = fooFactory;
}
public void doSomething(){
// can of course be generated with a normal for loop too
List<Foo> foos = IntStream.range(0, 10)
.mapToObj(i -> fooFactory.create())
.collect(Collectors.toList());
// do something with 10 foo instances
}
}