【问题标题】:Make @RefreshScope default将 @RefreshScope 设为默认值
【发布时间】:2021-07-04 04:28:19
【问题描述】:

如果我将 bean 注释为 @RefreshScope,我可以在其配置更改后获取它的新实例(例如,通过调用 /refresh 触发刷新)。

但这正是我想要的每个 bean:为什么我要更改配置文件,然后期望配置对应用程序的某些部分立即生效,而对某些部分仅在重启后生效?

所以问题是是否可以将其应用为默认范围?

此外,在典型的 Spring Boot 应用程序中,很多东西都是自动配置的(例如数据源),如果没有默认范围,我必须自己构建 bean 并正确注释它们。 (编辑:@ConfigurationProperties 会自动刷新,并且由于 Spring Boot 数据源自动配置基于此,因此确实在没有 @RefreshScope 的情况下会刷新)

我在这里错过了什么?

【问题讨论】:

    标签: spring-cloud


    【解决方案1】:

    https://cloud.spring.io/spring-cloud-static/spring-cloud.html#_environment_changeshttps://cloud.spring.io/spring-cloud-static/spring-cloud.html#_refresh_scope 有所有答案。

    @ConfigurationProperties 会在调用/refresh 时自动刷新,因此使用这些属性的 bean 会获取新值,对于其他和 @Value,则有 @RefreshScope

    我认为将@RefreshScope 设为默认值是不可能的。

    【讨论】:

    • 它没有回答是否可以作为默认范围应用的问题。它不能作为默认范围应用,但您可以通过使用 BeanFactoryPostProcessor.postProcessBeanFactory 在它们上显式设置刷新范围来使所有 bean 刷新范围。
    【解决方案2】:

    使用@RefreshScope 注释的bean 在配置更改后不会自动刷新。只有在缓存条目失效后才会刷新。

    From the docs:

    刷新范围 bean 是惰性代理,它们在使用时(即,在调用方法时)进行初始化,并且范围充当初始化值的缓存。要强制 bean 在下一次方法调用时重新初始化,您只需使其缓存条目无效。

    使缓存失效的一种方法是使用/refresh 端点。 请注意,刷新范围的 bean 可能会导致意外行为,请参阅上面提到的文档以了解为什么这不是默认行为。

    【讨论】:

    • 是的,我正在触发/refresh 端点。我已经编辑了我的问题。我阅读了文档的那部分,我当然没有正确地理解之前的段落 (cloud.spring.io/spring-cloud-static/…)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2019-05-15
    • 2020-07-01
    相关资源
    最近更新 更多