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

问题描述

使用 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 配置的专用范围,并且由于注释不可重复,我不确定会发生什么。