2014-01-08 1 views
3

С весной, то можно вводить список фасоли по классу интерфейса, как:Spring: Xml на основе автоматического связывание списка фасоли по типу интерфейса

@Component 
public class Service { 
    @Autowire 
    private List<InterfaceType> implementingBeans; 
    ... 
} 

Всех определенных бобы, которые реализуют этот интерфейс будет присутствовать в этот список.

Подход, основанный на аннотациях, для меня невозможен, так как класс службы находится в модуле, который не должен иметь зависимости от пружины.

Мне нужно использовать этот механизм снаружи через xml-конфигурацию.

<bean id="service" class="...Service"> 
    <property name="implementingBeans"> 
    ??? tell spring to create a list bean that resolves all beans of the interfaceType. 
    </property> 
</bean> 

Кто-нибудь знает, как это решить?

EDIT: Кроме того, существует более чем одно весеннее приложение, использующее эту услугу. Поэтому лучшим решением было бы полностью обработать этот сценарий через xml-конфигурацию. Затем я могу скопировать xml-части во все приложения spriong, которым это необходимо.

Я хочу, чтобы у вас не было типа инициализационного компонента, который получает введенную услугу и затем должен быть скопирован во все весенние приложения.

С уважением.

+0

Может ли он иметь зависимости javax.inject? Вы можете использовать '@ Inject' вместо' @ Autowired'. –

+0

хороший, тот работает. (конвертировать свой комментарий в ответ, чтобы получить карму;) – serprime

ответ

2

В модуле, что делает имеют зависимостей Spring, создать DTO

@Component(value = "beanDTO") 
public class BeanDTO { 
    @Autowire 
    private List<InterfaceType> implementingBeans; 

    public List<InterfaceType> getImplementingBeans() { 
     return implementingBeans; 
    } 
} 

, а затем использовать SpEL для извлечения значения implementingBeans из beanDTO фасоли.

<bean id="service" depends-on="beanDTO" class="...Service"> 
    <property name="implementingBeans" value="{beanDTO.implementingBeans}" /> 
</bean> 

Spring создаст BeanTDO боб, вводят все бобы, которые типа InterfaceType. Затем он создаст фасоль и определит ее свойства от 's implementingBeans.


Edit (от комментариев по вопросу)

В стремлении быть более JSR 330 уступчивыми, весна введена поддержкой javax.inject пакета Java EE в. Теперь вы можете аннотировать цели инъекции с помощью @javax.inject.Inject вместо @Autowired. Аналогичным образом, вы можете использовать @Named вместо @Component. The documentation has more details.

+0

Спасибо за ваш ответ! Использование SpEL - отличная идея. В настоящее время у меня есть аналогичный подход, когда bean-инициализатор получает список, который вводится, а затем инициализирует другой comopnent. У меня есть недостаток, который я должен скопировать BeanDTO во все весенние приложения, которые используют эту услугу. См. EDIT в вопросе. С чистой конфигурацией xml я могу экрнализировать applicationContext и ссылаться на него со всех приложений без необходимости дублирования классов. – serprime

+0

@serprime Я добавил некоторые подробности о '@ Inject' из моего предыдущего комментария к вопросу.Что касается необходимости копировать этот промежуточный компонент в каждом контексте, да, это не очень хорошо, но я не думаю, что Spring предоставляет любые другие механизмы, за исключением использования 'ApplicationContext # getBeansOfType (Class)' непосредственно. Если вы создадите классы bean, использующие 'ApplicationContextAware', вы можете использовать это. –

+0

Спасибо. Инъекция с конфигурацией xml сделала трюк. У меня есть 2 приложения весны, которые импортируют тот же context.xml для этого класса обслуживания. Наличие @Inject в поле списка автоматически очищает компоненты по типу интерфейса. Таким образом, мне не нужен бит инициализатора, который должен присутствовать в обоих пружинных приложениях. – serprime

Смежные вопросы