应用程序将收听EnvironmentChangeEvent
,并以几种标准方式进行更改(用户可以以常规方式添加ApplicationListeners
附加ApplicationListeners
)。当观察到EnvironmentChangeEvent
时,它将有一个已更改的键值列表,应用程序将使用以下内容:
-
重新绑定上下文中的任何
@ConfigurationProperties
bean -
为
logging.level.*
中的任何属性设置记录器级别
请注意,配置客户端不会通过默认轮询查找Environment
中的更改,通常我们不建议检测更改的方法(尽管可以使用@Scheduled
注释进行设置)。如果您有一个扩展的客户端应用程序,那么最好将EnvironmentChangeEvent
广播到所有实例,而不是让它们轮询更改(例如使用Spring Cloud总线)。
EnvironmentChangeEvent
涵盖了大量的刷新用例,只要您真的可以更改Environment
并发布事件(这些API是公开的,部分内核为Spring)。您可以通过访问/configprops
端点(普通Spring Boot执行器功能)来验证更改是否绑定到@ConfigurationProperties
bean。例如,DataSource
可以在运行时更改其maxPoolSize
(由Spring Boot创建的默认DataSource
是一个@ConfigurationProperties
bean),并且动态增加容量。重新绑定@ConfigurationProperties
不会覆盖另一大类用例,您需要更多的控制刷新,并且您需要更改在整个ApplicationContext
上是原子的。为了解决这些担忧,我们有@RefreshScope
。
刷新范围
当配置更改时,标有@RefreshScope
的Spring @Bean
将得到特殊处理。这解决了状态bean在初始化时只注入配置的问题。例如,如果通过Environment
更改数据库URL时DataSource
有开放连接,那么我们可能希望这些连接的持有人能够完成他们正在做的工作。然后下一次有人从游泳池借用一个连接,他得到一个新的URL。
刷新范围bean是在使用时初始化的懒惰代理(即当调用一个方法时),并且作用域作为初始值的缓存。要强制bean重新初始化下一个方法调用,您只需要使其缓存条目无效。
RefreshScope
是上下文中的一个bean,它有一个公共方法refreshAll()
来清除目标缓存中的范围内的所有bean。还有一个refresh(String)
方法可以按名称刷新单个bean。此功能在/refresh
端点(通过HTTP或JMX)中公开。
注意
|
@RefreshScope (技术上)在@Configuration 类上工作,但可能会导致令人惊讶的行为:例如,这并不 意味着该类中定义的所有@Beans 本身都是@RefreshScope 。具体来说,任何取决于这些bean的东西都不能依赖它们在刷新启动时被更新,除非它本身在@RefreshScope (在其中将重新刷新并重新注入其依赖关系),那么它们将从刷新的@Configuration )重新初始化。 |