一尘不染

如何在Spring中从application.properties重新加载@Value属性?

spring

我有一个spring-boot申请。在运行文件夹下,还有一个附加的配置文件:

dir/config/application.properties

应用程序启动时,它将使用文件中的值并将其注入到:

@Value("${my.property}")
private String prop;

问题:如何触发这些@Value属性的重新加载?我希望能够application.properties在运行时更改配置,并@Value更新字段(也许可以通过/reload在应用程序内部调用servlet 触发更新)。

但是如何?


阅读 708

收藏
2020-04-15

共1个答案

一尘不染

使用下面的bean每1秒重新加载config.properties。

@Component
public class PropertyLoader {

    @Autowired
    private StandardEnvironment environment;

    @Scheduled(fixedRate=1000)
    public void reload() throws IOException {
        MutablePropertySources propertySources = environment.getPropertySources();
        PropertySource<?> resourcePropertySource = propertySources.get("class path resource [config.properties]");
        Properties properties = new Properties();
        InputStream inputStream = getClass().getResourceAsStream("/config.properties");
        properties.load(inputStream);
        inputStream.close();
        propertySources.replace("class path resource [config.properties]", new PropertiesPropertySource("class path resource [config.properties]", properties));
    }
}

你的主要配置如下所示:

@EnableScheduling
@PropertySource("classpath:/config.properties")
public class HelloWorldConfig {
}

而不是使用@Value,每次你想要使用的最新属性

environment.get("my.property");

注意

尽管示例中的config.properties是从类路径中获取的,但是它仍然可以是已添加到类路径中的外部文件。

2020-04-15