TL; DR;
Я предлагаю решение, которое включает в себя немного работы, но в большинстве случаев более чистое.
В нем используется фабрика, которая содержит все зависимости Foo
и мы делаем Foo
больше не бобовые.Поэтому мы не полагаемся на Spring для создания экземпляров n
Foo
, вместо этого мы можем программно решить, сколько мы хотим создать.
Это, конечно, имеет некоторые плюсы и минусы:
Pro:
- Возможно программное создание
n
экземпляров.(может быть установлено через свойство, может быть вычислено, может быть введено ...) - Мы не используем пружину, чтобы решить, сколько экземпляров создается
- (возможно больше, ноСейчас я не могу думать о большем)
Con:
- У вас есть накладные расходы на создание нового класса (фабрики) для каждого типа, который вы хотитесоздать
Фактический ответ
1.Создайте интерфейс
. Он будет использоваться для создания n
экземпляров типа:
interface Factory<T> {
T create();
}
2.Создание реализаций
Это должно быть сделано для каждого типа, который вы хотите построить.Кроме того, каждая созданная реализация должна быть объявлена как пружинный компонент:
// 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);
}
}
3.Введите фабрику
Это делается в сервисе, который мы хотим создать 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
}
}