我目前正在开发一个基于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
}
答案 0 :(得分:0)
您是否看过RefreshScope注释?它可以帮助您更好地选择要刷新的bean。您可以通过以下链接查看:
https://cloud.spring.io/spring-cloud-static/docs/1.0.x/spring-cloud.html#_refresh_scope
将@Bean定义放在刷新范围内的便捷注释。以这种方式注释的Bean可以在运行时刷新,并且使用它们的任何组件将在下一个方法调用上获得一个新实例,完全初始化并注入所有依赖项。