2016-09-08 30 views
5

我正在使用spring启动,并且我有两个外部属性文件,以便我可以轻松更改其值。当外部属性文件更改时重新加载属性值,弹簧启动

但我希望spring应用程序在更新时会重新加载更改的值,就像从文件中读取一样。由于属性文件很容易满足我的需要,所以我希望我不需要数据库或文件。

我用两种不同的方式来加载属性值,代码示例会喜欢:

@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); 
    } 
} 

我启动我的应用程序与

-Dspring.config.location=conf/my.properties 

回答

0

恐怕你将需要重新启动Spring上下文。

0

(1)春季云的RestartEndPoint

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

RestartEndPoint是一个执行机构端点与spring-cloud-context捆绑。

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


(2)devtools

我不知道如果这是一个生产应用程序或没有。你可以通过点击devtools来做你想做的事情。

在这个其他答案,我写了另一个问题请看:Force enable spring-boot DevTools when running Jar

Devtools monitors for file changes

应用程序使用弹簧启动devtools会自动重启 每当在类路径更改的文件。

从技术上讲,devtools只能在IDE中工作。随着黑客,它也可以从罐子里发射。但是,我可能不会为真正的生产应用程序这样做,而是决定它是否适合您的需求。

0

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

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

在这里你可以找到文档到refresh scope and spring cloud.

0

您应该能够使用Spring云为

添加为依赖

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

然后用@RefreshScope注释

标记为@RefreshScope的Spring @Bean将得到特殊处理当有配置改变时。这解决了初始化时仅注入配置的有状态bean的问题。例如,如果DataSource在通过环境更改数据库URL时已打开连接,我们可能希望这些连接的持有者能够完成他们正在执行的操作。然后当有人从游泳池借用一个连接时,他会得到一个新的URL。

而且相关的,如果你有弹簧操动

对于春季启动器应用程序有一些额外的管理端点:

POST到

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

/refresh用于重新加载引导程序上下文和ref reshing的@RefreshScope豆

Spring Cloud Doc