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 57

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.