我正在使用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);
}
}
答案 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
您可以使用RestartEndPoint
:Programatically 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
答案 4 :(得分:0)
您可以遵循ContextRefresher.refresh()代码实现。
In [18]: import math
In [19]: print(math.pi)
3.141592653589793