2010-12-27 6 views
41

A causa di un'architettura plug-in, sto cercando di aggiungere un bean a livello di codice alla mia webapp. Ho creato un bean Spring tramite l'annotazione @Component e sto implementando l'interfaccia ApplicationContextAware.Aggiungi bean a livello di codice per Spring Web App Contesto

mia funzione di override si presenta così:

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

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

Fondamentalmente, io non riesco a capire come aggiungere un fagiolo per l'oggetto applicationContext dato a setApplicationContext. Qualcuno può dirmi come sto andando in questo modo sbagliato?

Ok, questo è ciò che ho finito con la soluzione:

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

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

risposta

34

In Primavera 3.0 è possibile rendere il chicco di implementare BeanDefinitionRegistryPostProcessor e aggiungere nuovi bean via BeanDefinitionRegistry.

Nelle versioni precedenti di Spring è possibile eseguire la stessa operazione in BeanFactoryPostProcessor (anche se è necessario trasmettere BeanFactory a BeanDefinitionRegistry, che potrebbe non riuscire).

+7

grazie. Immagino che la parte più difficile sia sapere cosa cercare. – user146714

+1

Si prega di fare attenzione a quanto indicato in [JavaDoc] (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/beans/factory/config/BeanPostProcessor.html): 'Un BeanFactoryPostProcessor può interagire con e modificare le definizioni di bean, ma mai istanze bean. Ciò potrebbe causare un'anticipazione dei fagioli prematura, violando il contenitore e causando effetti collaterali indesiderati. Se è richiesta l'interazione dell'istanza del bean, prendere in considerazione l'implementazione di BeanPostProcessor. – dgiffone

+0

Cosa fare con 'BeanDefinitionRegistryPostProcessor'? Supponiamo che abbia scritto questa lezione. Cosa succederà? Come si attiva? – Dims

8

Perché è necessario che sia del tipo GenericWebApplicationContext?
Penso che probabilmente puoi lavorare con qualsiasi tipo di ApplicationContext.

Di solito si usa un metodo init (in aggiunta al metodo setter):

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

E si sarebbe cablare i fagioli siano utilizzando

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

o

AutowireCapableBeanFactory.initializeBean(Object existingbean, String beanName)

28

Ecco un semplice codice:

ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); 
beanFactory.registerSingleton(bean.getClass().getCanonicalName(), bean); 
Problemi correlati