2016-09-08 31 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