我有一个 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 中找到任何关于此的明确文档。