4

我有一个 bean 注释,@ConfigurationProperties其中我有应用程序绑定所需的属性。我还对类进行了注释,@RefreshScope因此我可以刷新在运行时更改的任何配置属性。

基本版本如下所示:

@Component
@RefreshScope
@ConfigurationProperties
public class ServiceProperties {
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    } 
}

getName()方法将不断被不同的线程调用。

我从 Spring 中查看了此文档:https ://cloud.spring.io/spring-cloud-static/Greenwich.SR2/single/spring-cloud.html#refresh-scope

“刷新作用域 bean 是在使用时(即调用方法时)初始化的惰性代理,作用域充当初始化值的缓存。要强制 bean 在下一次方法调用时重新初始化,您必须使其缓存条目无效。

RefreshScope 是上下文中的一个 bean,并且有一个公共的 refreshAll() 方法通过清除目标缓存来刷新范围内的所有 bean。/refresh 端点公开了这个功能(通过 HTTP 或 JMX)。要按名称刷新单个 bean,还有一个 refresh(String) 方法。”

我从上述文档中的理解是,在调用刷新时(通过执行器 /actuator/refresh 或其他方式),bean 被重新创建并再次初始化。

我的问题是:整个进程线程安全吗?请注意确保在此 bean 刷新过程中,尝试访问上述类中的 name 属性的线程之间不会出现任何竞争条件。我没有从 Spring 中找到任何关于此的明确文档。

4

0 回答 0