SpringCloud 刷新范围
进行配置更改时,标记为@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
重新初始化。
更多建议: