@RefreshScope 具有不同的 *.properties 文件

@RefreshScope with different *.properties files

我想在调用刷新端点时重新加载多个配置文件。它与 application.properties 文件中的条目完美配合。任何其他文件都不会刷新。

这里有一个小例子:

pom.xml

...
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.3.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>2.3.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
        <version>2.2.4.RELEASE</version>
    </dependency>
</dependencies>
...

application.properties

greeting=Hi
management.endpoints.web.exposure.include=refresh

test.properties

test=Test

ConfigFileHolder1

@Repository
@PropertySource(value="application.properties")
@RefreshScope
public class ConfigFileHolder1 {
    @Value("${greeting}")
    private String greeting;
    
    public String getGreeting() {
        return greeting;
    }
}

ConfigFileHolder2

@Repository
@PropertySource(value="test.properties")
@RefreshScope
public class ConfigFileHolder2 {
    
    @Value("${test}")
    private String test;
    
    public String getTest() {
        return test;
    }
}

Api控制器

@Controller
@RefreshScope
public class ApiController implements Api {

    @Autowired
    private ConfigFileHolder1 config1;
    
    @Autowired
    private ConfigFileHolder2 config2;

   // do something with config1 and config2
   ...
}

调用refresh-endpoint后只有ConfigFileHolder1会刷新其值。要刷新 ConfigFileHolder2 的值,应用程序必须重新启动。

我必须更改什么才能刷新我所有 config-files/ConfigFileHolder 的值?

感谢您的帮助。

@RefreshScope 仅适用于 Spring Boot 加载的属性,不适用于稍后在进程中加载​​的 @PropertySources。因此,您需要告诉 Spring Boot 加载额外的 configuration files.

您可以通过添加名称 (spring.config.name) 或位置 spring.config.additional-location.

来完成此操作

指定其他名称时,请确保包括默认的 application 以及不会再加载的其他名称。

--spring.config.name=application,test

将以上内容指定为参数时,将检查所有位置的 application.propertiestest.properties,并且还将应用配置文件的扩展。

--spring.config.additional-location=classpath:test.properties

这只会从 class 路径加载 test.properties 并且几乎不可能在运行时更改文件,但文件将从该确切位置加载。将不应用配置文件扩展。