2010-12-27 3 views
41

Из-за архитектуры подключаемого модуля я пытаюсь добавить компонент в программную часть моего webapp. У меня есть компонент Spring, созданный с помощью аннотации @Component, и я реализую интерфейс ApplicationContextAware.Добавить Бин программно в Spring Web App Context

Моя функция коррекции выглядит следующим образом:

@Override 
public void setApplicationContext(ApplicationContext applicationContext) 
     throws BeansException { 

    // this fails 
    this.applicationContext = (GenericWebApplicationContext) applicationContext; 
} 

В принципе, я не могу понять, как добавить компонент к объекту ApplicationContext уделено setApplicationContext. Может ли кто-нибудь сказать мне, как я собираюсь сделать это неправильно?

Ok, это то, что я в конечном итоге с таким решением:

@Override 
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry bdr) 
     throws BeansException { 
    BeanDefinition definition = new RootBeanDefinition(
      <My Class>.class); 

    bdr.registerBeanDefinition("<my id>", definition); 
} 

ответ

34

Весной 3.0 вы можете сделать свой боб реализовать BeanDefinitionRegistryPostProcessor и добавлять новые бобы через BeanDefinitionRegistry.

В предыдущих версиях весны вы можете сделать то же самое в BeanFactoryPostProcessor (хотя вам необходимо отличить BeanFactory от BeanDefinitionRegistry, что может не получиться).

+7

спасибо. я думаю, самая сложная часть - знать, что искать. – user146714

+1

Пожалуйста, обратите внимание, что согласно [JavaDoc] (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/beans/factory/config/BeanPostProcessor.html): 'BeanFactoryPostProcessor может взаимодействовать и изменять определения bean-компонентов, но никогда не bean-экземпляры. Это может привести к преждевременному созданию экземпляра компонента, нарушению контейнера и возникновению непреднамеренных побочных эффектов. Если требуется взаимодействие экземпляра bean, подумайте об использовании BeanPostProcessor вместо этого. ' – dgiffone

+0

Что делать с' BeanDefinitionRegistryPostProcessor'? Предположим, я написал этот класс. Что дальше? Как его активировать? – Dims

8

Зачем вам это должно быть типа GenericWebApplicationContext?
Я думаю, что вы, вероятно, можете работать с любым типом ApplicationContext.

Обычно вы будете использовать метод инициализации (в дополнение к вашему методу сеттер):

@PostConstruct 
public void init(){ 
    AutowireCapableBeanFactory bf = this.applicationContext 
     .getAutowireCapableBeanFactory(); 
    // wire stuff here 
} 

А вы бы телеграфировать бобы использовать либо

AutowireCapableBeanFactory.autowire(Class, int mode, boolean dependencyInject)

или

AutowireCapableBeanFactory.initializeBean(Object existingbean, String beanName)

28

Вот простой код:

ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); 
beanFactory.registerSingleton(bean.getClass().getCanonicalName(), bean); 
Смежные вопросы