外部属性文件更改时重新加载属性值,弹出启动

时间:2016-09-08 09:28:13

标签: spring spring-boot

我正在使用spring boot,我有两个外部属性文件,因此我可以轻松更改其值。

但是我希望spring app会在更新时重新加载更改后的值,就像从文件中读取一样。由于属性文件很容易满足我的需要,我希望我不要'一般需要一个db或文件。

我使用两种不同的方式来加载属性值,代码示例将如下:

View Controller

我将使用

启动我的应用程序
@RestController
public class Prop1Controller{

    @Value("${prop1}")
    private String prop1;


    @RequestMapping(value="/prop1",method = RequestMethod.GET)
    public String getProp() {
        return prop1;
    }
}


@RestController
public class Prop2Controller{

    @Autowired
    private Environment env;

    @RequestMapping(value="/prop2/{sysId}",method = RequestMethod.GET)
    public String prop2(@PathVariable String sysId) {
        return env.getProperty("prop2."+sysId);
    }
}

5 个答案:

答案 0 :(得分:2)

我担心你需要重启Spring上下文。

答案 1 :(得分:1)

我认为实现您需求的唯一方法是启用spring-cloud。有一个刷新端点/refresh,它刷新上下文和bean。

我不太确定您是否需要存储配置的spring-cloud-config-server(它是一个微服务且非常容易构建)(Git或svn)。或者,如果它也可以仅由应用程序中的application.properties文件使用。

您可以在此处找到refresh scope and spring cloud.

的文档

答案 2 :(得分:0)

(1)Spring Cloud的RestartEndPoint

您可以使用RestartEndPointProgramatically restart Spring Boot application / Refresh Spring Context

RestartEndPoint是一个与spring-cloud-context捆绑在一起的Actuator EndPoint。

但是,RestartEndPoint不会监控文件更改,您必须自己处理。

(2)devtools

我不知道这是否适用于生产应用程序。你可以稍微破解devtools来做你想做的事。

看看我为另一个问题撰写的另一个答案:Force enable spring-boot DevTools when running Jar

Devtools monitors for file changes

  

使用spring-boot-devtools的应用程序将自动重启   每当类路径上的文件发生变化时。

从技术上讲,devtools仅适用于IDE。随着黑客攻击,它也可以从罐子里启动。但是,我可能不会为真正的生产应用程序执行此操作,您可以决定它是否符合您的需求。

答案 3 :(得分:0)

您应该可以使用Spring Cloud

将此作为依赖项添加

compile group: 'org.springframework.cloud', name: 'spring-cloud-starter', version: '1.1.2.RELEASE'

然后使用@RefreshScope注释

  

标记为@RefreshScope的Spring @Bean将在配置更改时获得特殊处理。这解决了有状态bean的问题,只有在初始化时才会注入其配置。例如,如果数据源在通过环境更改数据库URL时具有打开的连接,我们可能希望这些连接的持有者能够完成他们正在做的事情。然后,当有人从池中借用连接时,他会获得一个带有新URL的连接。

如果你有弹簧执行器也是相关的

  

对于Spring Boot Actuator应用程序,还有一些额外的管理端点:

     

POST到

     

/ env更新环境并重新绑定@ConfigurationProperties和日志级别

     

/ refresh用于重新加载引导带上下文并刷新@RefreshScope bean

Spring Cloud Doc

答案 4 :(得分:0)

您可以遵循ContextRefresher.refresh()代码实现。

In [18]: import math                                                                                                                                                                                                  

In [19]: print(math.pi)                                                                                                                                                                                               
3.141592653589793