Java Spring云配置刷新后如何执行自定义逻辑?

Java Spring云配置刷新后如何执行自定义逻辑?,java,spring,spring-boot,spring-cloud,spring-cloud-config,Java,Spring,Spring Boot,Spring Cloud,Spring Cloud Config,我将应用程序设置为使用SpringCloudConfig提供配置,并启用了监视器,以便配置服务器将更改事件发布到我的应用程序。配置得到正确更新,但我希望在配置更改时得到通知,以便我可以基于新配置执行一些自定义逻辑 我有这个配置对象 @Configuration @RefreshScope @ConfigurationProperties(prefix = "my.prefix") public class MyConfig { private Map<String, MyObjec

我将应用程序设置为使用SpringCloudConfig提供配置,并启用了监视器,以便配置服务器将更改事件发布到我的应用程序。配置得到正确更新,但我希望在配置更改时得到通知,以便我可以基于新配置执行一些自定义逻辑

我有这个配置对象

@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "my.prefix")
public class MyConfig {
    private Map<String, MyObject> configs;
    private String someValue;

    public Map<String, MyObject> getConfigs(){...}
    public void setConfigs(){...}

    public String getSomeValue(){...}
    public void setSomeValue(){...}
}
...
public class MyObject {
   private String field1;

   public String getField1() {...}
   public void setField1() {...}
}
现在,当我在配置中更改someValue,并且配置服务器发布刷新时,它调用setSomeValue()并将该值更新为新值。我可以将我的自定义逻辑添加到setSomeValue(),它会很好地工作。但是,在更新或从配置中添加/删除条目时,它似乎不会调用setConfigs()或setField1()

我尝试注册EnvironmentChangeEvents、RefreshEvents或RefreshScopeRefreshedEvents的侦听器,但这些侦听器要么在Spring更新值之前触发,要么根本没有触发。我还尝试向@PreDestroy和@PostConstruct方法添加逻辑,但只有PreDestroy最终被调用,并且在更新配置之前被调用。我还尝试实现InitializingBean并将我的逻辑放入afterPropertiesSet()中,但它也没有被调用


更新此配置时如何获得通知?

使用RefreshScopeRefreshedEvent侦听器,您可以在更新配置时获得通知

以下示例适用于我:

配置:

@Configuration
public class Config {
    @Bean
    @RefreshScope
    public A aBean() {
        return new A();
    }

    @Bean
    public RefreshScopeRefreshedListener remoteApplicationEventListener(A aBean) {
        return new RefreshScopeRefreshedListener(aBean);
    }

}
听众:

public class RefreshScopeRefreshedListener implements ApplicationListener<RefreshScopeRefreshedEvent> {
    private A aBean;

    public RefreshScopeRefreshedListener(A abean) {
        this.aBean = abean;
    }

    @Override
    public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
        System.out.println(aBean.getValue());

    }

}
公共类RefreshScopeRefreshedListener实现ApplicationListener{
私人安倍;
公共刷新范围刷新侦听器(abean){
this.aBean=aBean;
}
@凌驾
ApplicationEvent上的公共无效(RefreshScopeRefreshedEvent事件){
System.out.println(aBean.getValue());
}
}
它总是打印配置的新值

如果您已经尝试了此侦听器,您确定它已注册良好吗?bean是否已正确创建

public class RefreshScopeRefreshedListener implements ApplicationListener<RefreshScopeRefreshedEvent> {
    private A aBean;

    public RefreshScopeRefreshedListener(A abean) {
        this.aBean = abean;
    }

    @Override
    public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
        System.out.println(aBean.getValue());

    }

}