Java Spring云配置刷新后如何执行自定义逻辑?
我将应用程序设置为使用SpringCloudConfig提供配置,并启用了监视器,以便配置服务器将更改事件发布到我的应用程序。配置得到正确更新,但我希望在配置更改时得到通知,以便我可以基于新配置执行一些自定义逻辑 我有这个配置对象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
@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());
}
}