How to update configuration of SpringBoot applicat

2019-02-14 19:29发布

问题:

I am trying to figure out how can I dynamically update/reload externalized configuration in a Spring Boot application without restarting the whole application.

Most of the advice involves reloading ApplicationContext after changing the externalized configuration, but that is equivalent to restarting the entire application, so this is not really all that useful.

Reading through SpringBoot reference documentation, I found a chapter 23.7 Typesafe Configuration Properties.

If I understand it correctly, this allows to define simple POJO classes that will hold your application (externalized) configuration values as attributes.

In theory at least, this scheme could be used to bind beans only once to the required configuration POJO and upon configuration change just update the values in the POJO. Components could easily pick up the changes next time they access getters on the POJO...

However, I have yet not managed to figure out how to enable this type of behavior. Is there some glaringly obvious way to dynamically update components annotated with @ConfigurationProperties when relevant configuration has changed?

回答1:

It sounds like you're looking for @RefreshScope which is provided by Spring Cloud. From the Spring Cloud documentation:

A Spring @Bean that is marked as @RefreshScope will get special treatment when there is a configuration change. This addresses the problem of stateful beans that only get their configuration injected when they are initialized. For instance if a DataSource has open connections when the database URL is changed via the Environment, we probably want the holders of those connections to be able to complete what they are doing. Then the next time someone borrows a connection from the pool he gets one with the new URL.