当一个 spring 云配置项被刷新时,有没有办法知道在客户端能够重新计算一些东西?

When a spring cloud config item is refreshed, is there a way to know in the client to be able to re-calculate some things?

使用 spring 云配置,当我更新配置并在任何客户端上调用刷新时,有没有办法让我收到发生这种情况的通知?如果我基于某些 @ConfigurationProperties 构造对象,我将希望使用那些分层属性的新状态来刷新这些对象。我宁愿不在每次需要引用配置道具时执行查找;在我的例子中,最好在配置更改时刷新某些对象。那么,有没有办法连接到刷新生命周期?

编辑:理想情况下,如果我可以 @Configuration class 了解刷新事件,并且 re-bind/re-instantiate 一些相关的 Spring @Bean,那将是非常理想的!

好的,所以当我一个月前发布这个问题时,我显然对此很陌生,而且很天真。从那以后,我了解到 @ConfigurationProperties 在 spring 云配置客户端刷新时得到更新。假设你有一个 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 class 这样的:

@Configuration
public class PropsConfig {

    @Bean
    @RefreshScope
    @ConfigurationProperties(prefix = "settings")
    public ClientSettings clientSettings() {
        return new ClientSettings();
    }
}

如果您更新 spring 云配置服务器正在服务的配置文件,然后调用客户端上的 refresh 执行器端点,底层 bean 将被更新,任何服务连接此 bean 后将更新 bean。

所以,感谢 Spring 如此出色地实施了这个魔法巫术!开个玩笑,自动装配的 bean 被代理了,所以如果 bean 注册表更新了新值,注入单例的服务将具有更新的值是有道理的。这就提出了一个问题,如果相同的 @Configuration @Bean 方法添加 @Scope(SCOPE_PROTOTYPE) 会发生什么。由于 @RefreshScope 是 spring 云配置的专用范围,并且由于注释不可重复,所以我不确定会发生什么。