如何动态重新加载特定的应用程序上下文bean?

时间:2018-06-18 03:14:33

标签: spring groovy java-8 javabeans autowired

我目前正在开发一个基于Groovy的应用程序,它位于JDK8和spring-beans之上:4.3.1.RELEASE。我需要介绍一种方法,通过该方法我可以在运行时通过其名称重新创建目标bean。我做了类似的事情,但是当我对特定bean进行@autowire时,我当前的实现没有任何效果,在调用reload方法后,在应用程序运行时更改的属性不会反映在@autowired bean上。 context.refresh()对我来说很好,但是它会重新创建整个bean,这些bean最终会过度使用我的进程。所以基本上,我正在寻找一种方法,我可以通过它的名称重新加载特定的bean。

@Autowired
ApplicationContext applicationContext

@Override    
public synchronized Map<String, ?> reloadBean(String beanName) {

    ConfigurableApplicationContext context = (ConfigurableApplicationContext) applicationContext

    def beanObject = context.getBean(beanName)

    /* Reload the properties file */
    reloadProperties()

    /* Bean factroy method call */
    beanObject.buildFromConfiguration()

    DefaultSingletonBeanRegistry defaultSingletonBeanRegistry = (DefaultSingletonBeanRegistry) context.getBeanFactory()

    /* Destroy the given bean. */
    defaultSingletonBeanRegistry.destroySingleton(beanName)

    if(!defaultSingletonBeanRegistry.containsSingleton(beanName)) {

        /* Add the given singleton object to the singleton cache of this factory. */
        defaultSingletonBeanRegistry.registerSingleton(beanName, beanObject)

        beanLoadStatus.put(beanName, "Application context bean reloaded successfully.")
    } else {
        beanLoadStatus.put(beanName, "Failed to release old application context bean.")
    }

    return beanLoadStatus
}

1 个答案:

答案 0 :(得分:0)

您是否看过RefreshScope注释?它可以帮助您更好地选择要刷新的bean。您可以通过以下链接查看:

https://cloud.spring.io/spring-cloud-static/docs/1.0.x/spring-cloud.html#_refresh_scope

根据参考文献(http://static.javadoc.io/org.springframework.cloud/spring-cloud-commons-parent/1.1.4.RELEASE/org/springframework/cloud/context/config/annotation/RefreshScope.html

  

将@Bean定义放在刷新范围内的便捷注释。以这种方式注释的Bean可以在运行时刷新,并且使用它们的任何组件将在下一个方法调用上获得一个新实例,完全初始化并注入所有依赖项。