首页 > 解决方案 > 当 spring 云配置项刷新时,有没有办法在客户端知道能够重新计算一些东西?

问题描述

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

编辑:理想情况下,如果我能让一个@Configuration班级知道刷新事件,并重新绑定/重新实例化一些相关@Bean的 Spring ,那将是非常理想的!

标签: spring-cloud-configspring-cloud-config-server

解决方案


好的,所以当我一个月前发布这个问题时,我显然对此很陌生,而且很天真。从那以后,我了解到@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课程:

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


推荐阅读