Создание бобов на основе списка классов, разделенных запятыми - PullRequest
1 голос
/ 18 мая 2010

Есть ли способ в Spring создать коллекцию или массив bean-компонентов на основе списка классов, разделенных запятыми. Например:

package mypackage;
public class Bla {
 private Set<MyBean> beans;
 public void setBeans(Set<MyBean> beans) {
  this.beans = beans;
 }
}

С контекстом приложения:

<bean id="bla" class="mypackage.Bla">
 <property name="beans">
  <set>
   <bean class="mypackage.Bean1, mypackage.Bean2" />
  </set>
 </property>
</bean>

Предпочтительно, чтобы все компоненты были инициализированы и подключены из контекста, оставляя код максимально простым, возможно ли это?

1 Ответ

1 голос
/ 18 мая 2010

Используйте комбинацию ApplicationContextAware и ApplicationListener:

public class BeanInitializer implements ApplicationContextAware, ApplicationListener<ContextRefreshedEvent> {

    private ApplicationContext  context;
    private List<Class<?>>      beanClasses;

    public void onApplicationEvent(final ContextRefreshedEvent event) {
        final AutowireCapableBeanFactory beanFactory = this.context.getAutowireCapableBeanFactory();
        for (final Class<?> beanClass : this.beanClasses) {
            beanFactory.autowire(beanClass, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
        }
    }

    public void setApplicationContext(final ApplicationContext context) throws BeansException {
        this.context = context;
    }

    public void setBeanClasses(final List<Class<?>> beanClasses) {
        this.beanClasses = beanClasses;
    }

}

в конфигурации Spring, сделайте следующее:

<bean class="com.yourcompany.BeanInitializer">
<property name="beanClasses">
    <list>
        <value>com.yourcompany.Type1</value>
        <value>com.yourcompany.Type2</value>
        <value>com.yourcompany.Type3</value>
    </list>
</property>
</bean>

Отредактировано: на самом деле, если вы хотите разделить запятыми, вероятнопримерно так:

<bean class="com.yourcompany.BeanInitializer">
<property name="beanClasses" 
        value="com.yourcompany.Type1,com.yourcompany.Type2,com.yourcompany.Type3" />
</bean>

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

...