Из этого Q/A: How to define a List bean in Spring? Я знаю, что могу определить List<Foo> fooList
, заполненный экземплярами bean-ов Foo
, но используя конфигурацию XML. Вот пример:Как создать список, заполненный экземплярами прототипа, используя аннотации?
public interface Foo {
//methods here...
void fooMethod();
}
@Service("foo")
@Scope("prototype")
public class FooImpl implements Foo {
//fields and methods...
@Override
public void fooMethod() {
//...
}
}
@Service("fooCache")
@Scope
public class FooCacheImpl implements Foo {
//fields and methods...
@Override
public void fooMethod() {
//retrieves data from some cache
//...
}
}
@Service("fooWS")
@Scope("prototype")
public class FooWSImpl implements Foo {
//fields and methods...
@Override
public void fooMethod() {
//retrieves data from web service
//...
}
}
Я могу настроить клиента с помощью XML:
<bean id="fooClient" class="some.package.FooClient">
<property name="fooList">
<list>
<bean ... /> <!-- This may be fooImpl -->
<bean ... /> <!-- This may be fooCacheImpl -->
<bean ... /> <!-- This may be fooWSImpl -->
<!-- I can have more beans here -->
</list>
</property>
</bean>
Я хочу знать, если это может быть сделано с аннотациями только, нет необходимости, чтобы определить компонент через XML. Что-то вроде этого:
@Component
@Scope("prototype")
public class FooClient {
//which annotation(s) to use here to fill this list with FooImpl instances?
//I understand that if I have two implementations of Foo I may use a @Qualifier
//or use another list to note the different implementations.
private List<Foo> fooList;
public void bar() {
for (Foo foo : fooList) {
foo.fooMethod();
}
}
}
Я думаю, что было бы лучше, решение, которое не включает в себя инъекции ApplicationContext
ни BeanFactory
так FooClient
не тесно связанные с классами Spring. Кроме того, для моего случая я не могу использовать классы Java EE, такие как javax.inject.Provider
, как показано в этом сообщении в блоге: Spring 2.5.x+3.0.x: Create prototype instances from code.
вы хотите создать многие из той же компоненты в списке? –
вы можете создать много аннотированных инъекций сеттера, каждый из которых будет принимать компонент типа, и они добавят компонент в инкапсулированный список. –
И сколько экземпляров прототипа будет иметь ваш список? –