@RefreshScope 不工作 - Spring Boot
Posted
技术标签:
【中文标题】@RefreshScope 不工作 - Spring Boot【英文标题】:@RefreshScope not working - Spring Boot 【发布时间】:2017-12-21 14:18:58 【问题描述】:我遵循这里描述的方法:https://github.com/jeroenbellen/blog-manage-and-reload-spring-properties,唯一的区别是在我的例子中,属性被用于多个类,所以我将它们全部放在一个实用程序类CloudConfig
中,我参考它使用吸气剂的变量。这是类的样子:
@Configuration
@RefreshScope
public class CloudConfig
static volatile int count; // 20 sec
@Value("$config.count")
public void setCount(int count)
this.count = count;
public static int getCount()
return count;
我在其他类中使用变量count
,例如CloudConfig.getCount()
。我可以在启动时加载属性,但我无法动态更新它们。谁能告诉我做错了什么?如果我没有制作这个配置类,而是完全按照教程描述的方式进行操作,一切正常,但我无法将其适应我的用例。谁能告诉我我错过了什么?
【问题讨论】:
如果其他类是单例并且只在启动时加载这些值,刷新后它们将不会获得新值。 是的,但是 CloudConfig 中的那些会,我将在其他类中使用 getter (CloudConfig.getCount()),这样它们也会获得正确的值。对吗? 如果你只使用 getter 来设置值,它们不会,它们也不应该是静态的,而是常规方法,否则代理创建将失败。 【参考方案1】:尝试改用@ConfigurationProperties。 例如
@ConfigurationProperties(prefix="config")
public class CloudConfig
private Integer count;
public Integer count()
return this.count;
public void setCount(Integer count)
this.count = count;
reference doc from spring cloud 声明:
@RefreshScope 在 @Configuration 类上工作(技术上),但它 可能导致令人惊讶的行为:例如这并不意味着所有 该类中定义的@Bean 本身就是@RefreshScope。 具体来说,任何依赖于这些 bean 的东西都不能依赖它们 在启动刷新时被更新,除非它本身在 @RefreshScope(它将在刷新时重建,它的 重新注入依赖项,此时它们将被重新初始化 来自刷新的@Configuration)。
【讨论】:
但是我们如何在其他 bean 中引用这些? 自动将 ConfigurationProperties 连接到您的服务中。本段末尾有说明docs.spring.io/spring-boot/docs/current/reference/html/… Spring 文档对 ConfigurationProperties 进行了以下说明:- 外部化配置的注释。如果您想绑定和验证一些外部属性(例如,来自 .properties 文件),请将其添加到配置类中的类定义或 Bean 方法中。我可以知道它与RefershScope有什么关系吗??【参考方案2】:其他遇到此问题的人,请确保以下几点:
-
您的控制器带有
@RefreshScope
注释
Spring boot actuator 已添加到您的依赖项中,因为它是实际提供这些端点的模块:
org.springframework.boot 弹簧引导启动器执行器
刷新端点已更新为:
http://ip_address:port/actuator/refresh
默认情况下不启用刷新端点。您必须通过添加以下行在 bootstrap.properties 文件中明确启用它:
management.endpoints.web.exposure.include=*
我已启用所有端点,而您也可以启用特定端点。
【讨论】:
您的答案在多个方面都是错误的。没有理由用@RefreshScope
注释控制器,并且只有在需要手动刷新时才需要执行器。
在以前的版本中是必需的,在最新版本中可能不再需要。当答案解决问题时仍然没有任何意义。以上是关于@RefreshScope 不工作 - Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot+Nacos:@RefreshScope自动刷新原理
@RefreshScope 和 @ConditionalOnProperty 不起作用
SpringCloud配置文件刷新之@RefreshScope
config-server中@RefreshScope的"陷阱"