【问题标题】:Re-Initialize spring beans without app server restart or at runtime无需重新启动应用服务器或在运行时重新初始化 spring bean
【发布时间】:2015-06-03 23:31:36
【问题描述】:

有没有办法动态重新初始化spring bean?

在应用启动时,我通过 web.xml 中的 ContextLoaderListener 初始化 spring bean。

我的用例是在运行时可能会出现新的属性文件被加载到内存中的情况(通过 Apache commons 配置),我想重新初始化 bean,这样就可以在无需重新启动的情况下生效。

对此的任何指针表示赞赏。

【问题讨论】:

  • 您提到了“属性”文件。你是说资源包吗? Spring 支持可重新加载的资源包。
  • 是的,资源包,除了我在运行时使用 apache commons 配置添加新文件
  • configuration.addConfiguration(new PropertiesConfiguration("config.properties"));
  • 好的,你的 Spring bean 使用 Apache Commons Configuration 进行了配置。那么好问题!

标签: java spring servlets web-applications initialization


【解决方案1】:

能够通过让类实现 ApplicationContextAware 来解决它

public class ReloadConfig implements ApplicationContextAware{

private static Logger log = Logger.getLogger(ReloadConfig.class);


private Config config;

@Autowired
ApplicationContext applicationContext;

private ReloadConfig() {
    // Exists only to defeat instantiation.
    config = Config.getInstance();
}

public void reloadIfNotLoaded() throws ConfigurationException{

    CompositeConfiguration configuration = new CompositeConfiguration();

    if(config.getHealthFile() == null){

        log.info("Reloading Adding default properties found in config.properties");
        configuration.addConfiguration(new PropertiesConfiguration("config.properties"));


        ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext)getApplicationContext();
        configurableApplicationContext.refresh();
        setApplicationContext(configurableApplicationContext);
    }



}

public void setApplicationContext(ApplicationContext context) throws BeansException {
    applicationContext = context;
}

public ApplicationContext getApplicationContext() {
    return applicationContext;
}

【讨论】:

  • 无法理解你如何使用它。它叫什么名字?