我有一个基类Foo
和多个继承自它的类。
到现在为止,我只需要每一个
所以我只是做了:
@Autowired
private List<Foo> foos;
但是事情发生了变化,我想生成每种类型的多个对象(即x
实例Foo1
,y
实例Foo2
等)
我如何使用 Spring Boot 做到这一点?
注意:我真的不需要将它填充到列表中。
编辑:
我将进一步解释我面临的问题。每个类代表一种任务(它是一个Runnable
)。每个任务都有固定数量的线程。我想为每个线程实例化一个新对象。
所以我的问题是:如何利用 Spring 来解决这个问题?回到当我只需要一个实例来完成每项任务时,这很容易(参见List<Foo>
示例)
我提出了一个解决方案,其中包括一些工作,但在大多数情况下更干净。
它使用一个包含所有依赖项的工厂,Foo
我们Foo
不再制作spring bean。因此,我们不依赖 Spring 来实例化 的n
实例Foo
,而是可以通过编程方式决定要创建多少个实例。
这当然有一些优点和缺点:
n
实例。(可以通过属性设置,可以计算,可以注入...)这将用于创建n
类型的实例:
interface Factory<T> {
T create();
}
必须为您要构造的每种类型执行此操作。此外,每个创建的实现都必须声明为 spring bean:
// 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);
}
}
这是在我们要创建的服务中完成n
的Foo
:
@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
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句