Spring在运行时更改属性文件

时间:2018-04-23 09:17:17

标签: java spring spring-boot properties-file

我使用的是Spring Boot,我有一个属性文件p.properties:

p1 = some val1
p2 = some val2

配置类:

@Configuration
@PropertySource("classpath:p.properties")
public class myProperties {

    public myProperties () {
        super();
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

我正在使用它来访问该属性:

@Value("${p1}")
private String mProperty;

一切都很好。 我想从应用程序外部更改p.properties文件中的p1,下次我将使用mProperty时,它将包含新值而无需重新启动应用程序。 有可能吗?

谢谢, 阿维

3 个答案:

答案 0 :(得分:3)

您只需使用spring boot actuator即可。 只需在maven/gradle config中添加执行器依赖项,您就应该在更新property文件时看到实时重新加载。

注意:您不必重新启动应用程序,但执行器将自行live reloads

答案 1 :(得分:1)

我认为,在这种情况下,建议将其保存在数据库中,以便可以更改和更改数据库。无缝访问。我们有一个类似的场景,我们将数据库的加密密码保存在属性文件中。在连接到db时,需要对其进行解密。我们通过如下扩展PropertyPlaceholderConfigurer来实现这一目标。

public class MyPropertyConfigurer extends PropertyPlaceholderConfigurer{
  protected void convertProperties(Properties props){
        Enumeration<?> propertyNames = props.propertyNames();
        while (propertyNames.hasMoreElements()) {
            String propertyName = (String) propertyNames.nextElement();
            String propertyValue = props.getProperty(propertyName);
            if(propertyName.indexOf("db.password") != -1){
                decryptAndSetPropValue(props,propertyName,propertyValue);
            }
        }
    }
}

但是,加载属性文件时只执行一次。

答案 2 :(得分:1)

如果要在运行时更改属性,并且不想重新启动服务器,请执行以下步骤:

  1. Application.properties

    app.name = xyz

    management.endpoints.web.exposure.include = *

  2. 在pom.xml中添加以下依赖项

    org.springframework.boot 弹簧启动启动器执行器 org.springframework.cloud 春云语境 2.0.1。发布

    3)将application.properties放在config文件夹中。 config文件夹必须位于运行jar的位置。

  3. 添加ApplcationProperties.java

    @RefreshScope @零件 @ConfigurationProperties(前缀=“ app”) 公共类ApplcationProperties { 私有字符串名称; // getter和setter }

  4. 编写ApplicationController.java并注入ApplcationProperties

    @自动连线 ApplcationProperties applcationProperties;

    @RestController 公共类ApplicationController { @GetMapping(“ / find”) 字符串getValue() { 返回applicationProperties.getName(); } }

  5. 运行spring boot应用程序

  6. 从浏览器中呼叫localhost:XXXX/find

    输出:xyz

  7. 将application.properties中的值从xyz更改为abc

  8. 使用邮递员向localhost:XXXX/actuator/refresh发送put / options请求 -请注意,此请求应为PUT / OPTIONS

  9. 从浏览器中呼叫localhost:XXXX/find

    输出:abc