Spring?boot讀取外部化配置的方法
這篇文章我們主要討論 Spring Boot
的外部化配置功能,該功能主要是通過(guò)外部的配置資源實(shí)現(xiàn)與代碼的相互配合,來(lái)避免硬編碼,提供應(yīng)用數(shù)據(jù)或行為變化的靈活性。本文主要記錄讀取外部化配置的幾種常見的操作方式,相關(guān)原理不在此記錄。
1. Properties / YAML
我們一般會(huì)將相關(guān)配置信息寫在Properties / YAML文件中,然后在通過(guò)某種方式來(lái)進(jìn)行數(shù)據(jù)的獲取。
比如下圖我就定義了三個(gè)參數(shù):
1.1 Environment
首先我們可以通過(guò)Environment來(lái)進(jìn)行外部配置信息的加載(Spring Boot中的所有外部化配置都會(huì)加載到Environment中)。
首先我們直接通過(guò)Autowired
注入Environment:
@Autowired Environment environment;
然后直接獲取數(shù)據(jù)信息即可。
@RestController public class ConfigController { @Autowired Environment environment; @GetMapping("/env") public String env() { return environment.getProperty("name") + "\n"; } }
1.2 Value注解
第二種方式就是我們比較常用的注解方式,直接通過(guò)注解寫入相應(yīng)的KEY,獲取對(duì)應(yīng)的value。如果沒有KEY值則啟動(dòng)的時(shí)候會(huì)報(bào)錯(cuò)。
@Value("${name}") private String name;
2. 自定義Properties文件
有的時(shí)候可能我們的外部化配置不是寫在application.properties
中,而是寫在一些自定義Properties中,那這個(gè)時(shí)候我們?nèi)绾瓮ㄟ^(guò)value注解獲取其中的數(shù)據(jù)呢?
在上面說(shuō)environment
的時(shí)候,我們知道Spring Boot中的所有外部化配置都會(huì)加載到Environment中,我們可以在Spring boot構(gòu)建environment之前對(duì)其進(jìn)行相關(guān)的修改。
我們可以通過(guò)實(shí)現(xiàn)EnvironmentPostProcessor
接口并重寫postProcessEnvironment
方法來(lái)對(duì)environment進(jìn)行修改。
整體流程如下:
實(shí)現(xiàn)接口,重寫方法
定義Properties,以及我們需要獲取數(shù)據(jù)文件的名字。
解析文件將數(shù)據(jù)添加至environment中
public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor { private final Properties properties = new Properties(); private String propertiesFile = "custom.properties"; @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { Resource resource = new ClassPathResource(propertiesFile); environment.getPropertySources().addLast(loadProperties(resource)); } private PropertySource<?> loadProperties(Resource resource) { if (!resource.exists()) { throw new RuntimeException("file not exist"); } try { //custom.properties properties.load(resource.getInputStream()); return new PropertiesPropertySource(resource.getFilename(), properties); } catch (IOException e) { throw new RuntimeException(e); } } }
這個(gè)時(shí)候代碼寫好之后,我們可以通過(guò)value注解獲取數(shù)據(jù)了嗎?我們運(yùn)行試試。(記得將application.properties中的數(shù)據(jù)清空)
這個(gè)時(shí)候我們會(huì)發(fā)現(xiàn)運(yùn)行失敗,沒有找到對(duì)應(yīng)key。這是為什么呢?這是由于以上都是我們對(duì)Spring boot功能的拓展,做這種功能拓展的時(shí)候,我們需要使用到我們的SPI機(jī)制,按照拓展規(guī)則去定義我們的拓展實(shí)現(xiàn)。這樣才能使我們的拓展點(diǎn)生效。
這里和JAVA做SPI機(jī)制的實(shí)現(xiàn)不一樣,之前做SPI都是創(chuàng)建的全類名文件,然后寫對(duì)應(yīng)的實(shí)現(xiàn)類,這邊文件名需要定義為spring.factories。
org.springframework.boot.env.EnvironmentPostProcessor=\ com.example.springbootzookeeper.CustomEnvironmentPostProcessor
這個(gè)時(shí)候我們重新運(yùn)行項(xiàng)目,可以發(fā)現(xiàn)成功運(yùn)行。
3. 其他命令參數(shù)
Spring boot 中我們是有很多種外部化配置的方式,比如環(huán)境變量、系統(tǒng)變量、命令行參數(shù)等。我們?cè)谙路窖菔疽环N類型的外部化配置:我們可以通過(guò)這種-D
形式進(jìn)行外部化配置。value注解后面的key對(duì)應(yīng)-D
后面的key。
@Value("${test}") private String command;
總結(jié)
到此這篇關(guān)于Spring boot讀取外部化配置的方法的文章就介紹到這了,更多相關(guān)Spring boot外部化配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot整合Springfox生成restful的在線api文檔
這篇文章主要為大家介紹了Spring boot整合Springfox生成restful在線api文檔,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Java中final,finally,finalize?有什么區(qū)別
這篇文章主要給大家分享的是?Java中final,finally,finalize?到底有什么區(qū)別,文章圍繞final,finally,finalize的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考的價(jià)值,需要的朋友可以參考一下2021-11-11SpringSecurity+Redis認(rèn)證過(guò)程小結(jié)
這篇文章主要介紹了SpringSecurity+Redis認(rèn)證過(guò)程小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01SpringBoot+Vue+Axios+BootStrap實(shí)現(xiàn)圖書的增刪改查功能示例
本文主要介紹了SpringBoot+Vue+Axios+BootStrap實(shí)現(xiàn)圖書的增刪改查功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12使用vscode搭建javaweb項(xiàng)目的詳細(xì)步驟
我個(gè)人是很喜歡VsCode的,開源免費(fèi)、功能全面,所以為了方便,我把我?guī)缀跛械倪\(yùn)行都集成到了VsCode上來(lái),JavaWeb也不例外,下面這篇文章主要給大家介紹了關(guān)于使用vscode搭建javaweb項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2022-11-11關(guān)于Java8的foreach中使用return/break/continue產(chǎn)生的問題
這篇文章主要介紹了關(guān)于Java8的foreach()中使用return/break/continue產(chǎn)生的問題,在使用foreach()處理集合時(shí)不能使用break和continue這兩個(gè)方法,也就是說(shuō)不能按照普通的for循環(huán)遍歷集合時(shí)那樣根據(jù)條件來(lái)中止遍歷,需要的朋友可以參考下2023-10-10關(guān)于@ApiModel和@ApiModelProperty的使用
這篇文章主要介紹了關(guān)于@ApiModel和@ApiModelProperty的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11