繁体   English   中英

无法在 Spring 引导应用程序中刷新现有的 singleton bean

[英]Unable to refresh existing singleton bean in Spring boot application

我在我的 spring 引导应用程序中定义了一个配置,如下所示:

@Configuration
public class RuleEngineConfiguration {

  private final DatabaseRuleLoader databaseRuleLoader;

  public RuleEngineConfiguration(
      DatabaseRuleLoader databaseRuleLoader) {
    this.databaseRuleLoader = databaseRuleLoader;
  }

  @Bean
  public RuleEngineManager ruleEngine() {
    return RuleEngineManagerFactory.getRuleEngineManager(this.databaseRuleLoader);
  }

现在我想在我的 spring 引导应用程序中刷新RuleEngineManager bean,以创建/更新数据库中给定表中的一行,刷新 function 如下定义:

public void refresh() {
    databaseRuleLoader.refresh(); <---THIS RELOADS ROWS FROM DB
    BeanDefinitionRegistry registry = (BeanDefinitionRegistry) applicationContext
        .getAutowireCapableBeanFactory();
    RuleEngineManager ruleEngineManager = RuleEngineManagerFactory
        .getRuleEngineManager(databaseRuleLoader);
    registry.removeBeanDefinition("ruleEngine");
    ((SingletonBeanRegistry) registry).registerSingleton("ruleEngine", ruleEngineManager);
  }

在我的应用程序中,我需要RuleEngineManager bean,我按如下方式获取 bean:

((RuleEngineManager) applicationContext.getBean("ruleEngine"))

即使每次都执行刷新 function,我正在创建/更新数据库中的任何行,但是,我没有看到任何更改。 现有的RuleEnginemanager bean 似乎作为依赖项被注入。 我无法弄清楚我在这里缺少什么。

有人可以在这里帮忙吗? 谢谢。

我的建议是使用工厂(设计模式)......例如以这种方式:

// you already have this class
public class RuleEngineManagerFactory{ 
   private DatabaseRuleLoader databaseRuleLoader;
   private RuleEngineManager ruleEngineManager;
   public RuleEngineManagerFactory(DatabaseRuleLoader databaseRuleLoader) {
     this.databaseRuleLoader = databaseRuleLoader;
   }
   public RuleEngineManager getRuleEngineManager(){
     if(this.ruleEngineManager == null){
         ruleEngineManager = new RuleEngineManager(this.databaseRuleLoader);
     }
     return this.ruleEngineManager;
   }
   public void refresh(){
      ruleEngineManager = new RuleEngineManager(this.databaseRuleLoader);
   }
}

这样,您将在需要的任何地方注入RuleEngineManagerFactory ,并且可以刷新RuleEngineManager ...因此您必须为经理的工厂提供一个 singleton,而不是经理本身

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM