2017-03-27 2 views
3

So ist der Titel ziemlich einfach. Ich habe eine Handler-Klasse DynamicBeanHandler, die BeanDefinitionRegistryPostProcessor Schnittstelle von Feder implementiert implementiert. In dieser Klasse Hinzufügen ich mehrere SCOPE_SINGLETON Bohnen, die Bean-Klasse als MyDynamicBean als folgt-Wie fügt man eine Bean-Instanz zur Laufzeit im Frühjahr hinzu WebApplicationContext?

GenericBeanDefinition myBeanDefinition = new GenericBeanDefinition(); 
myBeanDefinition.setBeanClass(MyDynamicBean.class); 
myBeanDefinition.setScope(SCOPE_SINGLETON); 
myBeanDefinition.setPropertyValues(getMutableProperties(dynamicPropertyPrefix)); 
registry.registerBeanDefinition(dynamicBeanId, myBeanDefinition); 

Verfahren eingestellt haben getMutableProperties() ein Objekt von MutablePropertyValues zurückgibt.

Später, ich SpringUtil.getBean(dynamicBeanId) die erforderliche MyDynamicBean Instanz zu holen, wo SpringUtil Klasse ApplicationContextAware implementiert. All das funktioniert großartig. Das Problem tritt auf, wenn ich eine dieser Instanzen entfernen und später eine neue Instanz hinzufügen möchte, in der ich die Registrierungsinstanz nicht habe. Kann mir bitte jemand helfen, einen Weg zu finden?

Im Folgenden finden Sie den Code für die Klasse SpringUtil -

public class SpringUtil implements ApplicationContextAware { 

    private static ApplicationContext applicationContext; 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     SpringUtil.applicationContext = applicationContext; 
    } 

    public static ApplicationContext getApplicationContext() { 
     return applicationContext; 
    } 

    public static Object getBean(String beanId) { 
     return applicationContext.getBean(beanId); 
    } 

    public static <T> T getBean(String beanId, Class<T> beanClass) { 
     return applicationContext.getBean(beanId, beanClass); 
    } 
} 
+0

Warum möchten Sie das tun? Versuchen Sie, die Initialisierung zu verzögern? –

+0

Also, ich möchte es tun, weil "MyDynamicBean" einige Eigenschaften enthält, die ich zur Laufzeit von der Datenbank programmatisch aktualisieren möchte. Bitte beachten Sie, dass ich die Bean-Instanz nach dem Initialisieren des Kontexts aktualisieren und eine neue Bean-Instanz hinzufügen möchte. – Abhishek

+0

@Abhishek Können Sie den Code Ihres aktuellen 'SpringUtil's veröffentlichen? – developer

Antwort

6

Sie Gebrauch von BeanDefinitionRegistry (look here für API) machen können dynamisch die Bohnen zu entfernen oder zu registrieren.

Also, in Ihrer SpringUtil Klasse, können Sie die folgenden Verfahren fügen Sie die vorhandenen Bean Definition removeBeanDefinition() zu entfernen und dann eine neue Bean Definition hinzufügen, indem Sie registerBeanDefinition() verwenden.

public void removeExistingAndAddNewBean(String beanId) { 

    AutowireCapableBeanFactory factory = 
        applicationContext.getAutowireCapableBeanFactory(); 
    BeanDefinitionRegistry registry = (BeanDefinitionRegistry) factory; 
    registry.removeBeanDefinition(beanId); 

    //create newBeanObj through GenericBeanDefinition 

    registry.registerBeanDefinition(beanId, newBeanObj); 
} 
+0

Also, wenn diese Typumwandlung funktioniert, kann ich dies in jeder Klasse tun, wo ich 'ApplicationContext' in die Hände bekomme. Ist es so? – Abhishek

+0

Ja, Sie haben Recht – developer

+1

Aber 'ApplicationContext' nur in' SpringUtil' behalten, weil es nicht eine gute Idee ist, 'ApplicationContext' an zu vielen Stellen verfügbar zu machen – developer

Verwandte Themen