问题描述
使用 spring cloud config,当我更新配置并在任何客户端上调用 refresh 时,有没有办法通知我发生了这种情况?如果我基于某些 @ConfigurationProperties
构建对象,我将希望使用这些分层属性的新状态刷新这些对象。我宁愿每次需要引用配置道具时都不执行查找;就我而言,最好在配置更改时刷新某些对象。那么,有没有办法与刷新生命周期挂钩?
编辑:理想情况下,如果我能让 @Configuration
类了解刷新事件,并重新绑定/重新实例化一些相关的 Spring @Bean
,那将是非常理想的!>
解决方法
好的,所以当我一个月前发布这个问题时,我显然对此很陌生,而且很天真。从那以后,我了解到 @ConfigurationProperties
会在 Spring Cloud 配置客户端刷新时更新。假设你有一个 bean(当然是 lombok 来减少样板文件):
@Data
public class ClientSettings {
private List<String> list1 = new ArrayList<>();
private List<String> list2 = new ArrayList<>();
private List<String> list3 = new ArrayList<>();
}
您有一个 @Configuration
类,如下所示:
@Configuration
public class PropsConfig {
@Bean
@RefreshScope
@ConfigurationProperties(prefix = "settings")
public ClientSettings clientSettings() {
return new ClientSettings();
}
}
如果您更新 Spring Cloud 配置服务器正在提供服务的配置文件,然后调用客户端上的 refresh
执行器端点,底层 bean 将被更新,并且连接了该 bean 的任何服务都将具有刷新后的更新 bean。
所以,为 Spring 将这个神奇的伏都教魔法实现得如此出色!别开玩笑了,自动装配的 bean 是代理的,所以如果 bean 注册表更新了新值,那么具有注入单例的服务将具有更新的值是有道理的。这就提出了如果相同的 @Configuration @Bean
方法添加 @Scope(SCOPE_PROTOTYPE)
会发生什么的问题。由于 @RefreshScope
是 spring cloud 配置的专用范围,并且由于注释不可重复,我不确定会发生什么。