SpringCloud 刷新范围

2023-06-06 17:10 更新

进行配置更改时,标记为​@RefreshScope​的Spring ​@Bean​将得到特殊处理。此功能解决了状态beans的问题,该状态仅在初始化时才注入配置。例如,如果通过​Environment​更改数据库URL时DataSource具有打开的连接,则您可能希望这些连接的持有者能够完成他们正在做的事情。然后,下次某物从池中借用一个连接时,它将获得一个具有新URL的连接。

有时,甚至可能必须将​@RefreshScope​批注应用到只能初始化一次的某些beans上。如果bean是“不可变的”,则必须用​@RefreshScope​注释bean或在属性键​spring.cloud.refresh.extra-refreshable​下指定类名。

重要

如果您自己创建一个​DataSource​ bean,而实现是一个​HikariDataSource​,则返回最特定的类型,在这种情况下为​HikariDataSource​。否则,您将需要设置​spring.cloud.refresh.extra-refreshable=javax.sql.DataSource​。

刷新作用域beans是惰性代理,它们在使用时(即在调用方法时)进行初始化,并且作用域充当初始化值的缓存。若要强制bean在下一个方法调用上重新初始化,必须使它的缓存条目无效。

RefreshScope​在上下文中是bean,并具有公用的​refreshAll()​方法,可通过清除目标缓存来刷新作用域中的所有beans。​/refresh​端点公开了此功能(通过HTTP或JMX)。要按名称刷新单个bean,还有一个​refresh(String)​方法。

要公开​/refresh​端点,您需要在应用程序中添加以下配置:

management:
  endpoints:
    web:
      exposure:
        include: refresh

@RefreshScope​在​@Configuration​类上(在技术上)有效,但是可能会导致令人惊讶的行为。例如,这并不意味着该类中定义的所有​@Beans​本身都在​@RefreshScope​中。具体而言,除非刷新本身在​@RefreshScope​中,否则依赖那些beans的任何内容都不能依赖于刷新启动时对其进行更新。在这种情况下,将在刷新时重建它,并重新注入其依赖项。此时,它们将从刷新的​@Configuration​重新初始化。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号