Autowire reference beans в список по типу
у меня есть один класс, который имеет список объектов Daemon
тип.
class Xyz {
List<Daemon> daemons;
}
моя весенняя конфигурация выглядит так.
<bean id="xyz" class="package1.Xyz">
<property name="daemons" ref="daemonsList">
</bean>
<bean id="daemon1" class="package1.DaemonImpl1"/>
<bean id="daemon2" class="package1.DaemonImpl2"/>
<bean id="daemonsList" class="java.util.ArrayList">
<constructor-arg>
<list>
<ref bean="daemon1" />
<ref bean="daemon2" />
</list>
</constructor-arg>
</bean>
теперь вместо явного подключения каждой реализации демона в списке, можно ли автоматически подключить все бобы типа Daemon
автоматически в список. Проблема, которую я пытаюсь решить, это, если кто-то создает Боб новой реализации Daemon
класс и забывает подключить его в список.
Я видел этот вопрос где-то на StackOverflow, но не смог найти снова. Прошу прощения за это.
1 ответ:
он должен работать следующим образом (удалите компонент ArrayList из вашего XML):
public Class Xyz { private List<Daemon> daemons; @Autowired public void setDaemons(List<Daemon> daemons){ this.daemons = daemons; } }
Я не думаю, что есть способ сделать это в XML.
посмотреть: 3.9.2.
@Autowired
и@Inject
:также возможно обеспечить все фасоли определенного типа от ApplicationContext путем добавления аннотации к полю или методу, что ожидает массив такого типа:
public class MovieRecommender { @Autowired private MovieCatalog[] movieCatalogs; // ... }
то же применяется для типизированных коллекций:
public class MovieRecommender { private Set<MovieCatalog> movieCatalogs; @Autowired // or if you don't want a setter, annotate the field public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) { this.movieCatalogs = movieCatalogs; } // ... }
кстати, по состоянию на весну 4.x,эти списки можно заказать автоматически с помощью
@Ordered
.