精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺談SpringBoot加載配置文件的實現方式,通俗易懂!

開發 架構
今天,我們就一起來聊一聊SpringBoot加載配置文件的幾種玩法!

一、簡介

在實際的項目開發過程中,我們經常需要將某些變量從代碼里面抽離出來,放在配置文件里面,以便更加統一、靈活的管理服務配置信息。比如,數據庫、eureka、zookeeper、redis、mq、kafka 等服務組件的連接參數配置,還有我們自定義的項目參數配置變量。

當然,實際上根據當前的業務需求,我們往往會自定義參數,然后注入到代碼里面去,以便靈活使用!

今天,我們就一起來聊一聊SpringBoot加載配置文件的幾種玩法!

SpringBoot 項目在啟用時,首先會默認加載bootstrap.properties或者bootstrap.yml這兩個配置文件(這兩個優先級最高);接著會加載application.properties或application.yml;如果何配置了spring.profiles這個變量,同時還會加載對應的application-{profile}.properties或者application-{profile}.yml文件,profile為對應的環境變量,比如dev,如果沒有配置,則會加載profile=default的配置文件。

雖然說配置項都寫在同一個配置文件沒有問題,但是很多時候我們仍然希望能分開寫,這樣會比較清晰,比如zookeeper的配置寫在zookeeper.properties,數據庫相關的配置寫在datasource.properties等等,因此就需要設置加載外部配置文件!

具體該如何實現呢,我們一起來看看!

二、代碼實踐

2.1、通過@value注解實現參數加載

當我們想要在某個類里面注入某個變量,通過@value注解就可以簡單實現參數的注入!

例如application.properties文件里,配置一個config.name的變量key,值為zhangsan;

//參數定義
config.name=zhangsan

然后在對應的類里面,通過參數@value注入即可!

@RestController
public class HelloController {

@Value("${config.name}")
private String config;

@GetMapping("config")
public String config(){
return JSON.toJSONString(config);
}
}

使用@value注解注入配置,通常情況下有個要求就是,注解里面的變量,必須在application.properties文件里面事先定義好,否則啟動報錯!

當然,如果我們不想讓它抱錯,我們可以給它一個缺省值xxx,比如:

@Value("${config.name:xxx}")
private String config;

這樣,SpringBoot 項目在啟用時不會報錯!

2.2、通過@ConfigurationProperties注解實現參數加載

某些場景下,@value注解并不能滿足我們所有的需求,比如參數配置的數據類型是一個對象或者數組,這個時候才用@ConfigurationProperties會是一個比較好的選擇!

  • 配置一個對象類型的參數

例如在application.properties文件里,當我們想配置一個對象類型的參數,我們可以這樣操作!

//參數定義
config2.name=demo_1
config2.value=demo_value_1

然后,創建一個配置類Config2,用于將定義的變量映射到配置類里面。

@Component
@ConfigurationProperties(prefix = "config2")
public class Config2 {

public String name;

public String value;

//...get、set
}

讀取數據的方式,也很簡單,直接注入到對應的類里面就可以了;

@RestController
public class HelloController {

@Autowired
private Config2 config2;

@GetMapping("config2")
public String config2(){
return JSON.toJSONString(config2);
}
}
  • 配置一個Map類型的參數

例如在application.properties文件里,當我們想配置一個 Map 類型的參數,我們可以這樣操作!

//參數定義
config3.map1.name=demo_id_1_name
config3.map1.value=demo_id_1_value
config3.map2.name=demo_id_2_name
config3.map2.value=demo_id_2_value

然后,創建一個配置類Config3,用于將定義的變量映射到配置類里面。

@Component
@ConfigurationProperties(prefix = "config3")
public class Config3 {

private Map<String, String> map1 = new HashMap<>();

private Map<String, String> map2 = new HashMap<>();

//...get、set
}

讀取數據的方式,與之類似!

@RestController
public class HelloController {

@Autowired
private Config3 config3;

@GetMapping("config3")
public String config3(){
return JSON.toJSONString(config3);
}
}
  • 配置一個List類型的參數

例如在application.properties文件里,當我們想配置一個 List 類型的參數,我們可以這樣操作!

//參數定義
config4.userList[0].enable=maillist_1_enable
config4.userList[0].name=maillist_1_name
config4.userList[0].value=maillist_1_value

config4.userList[1].enable=maillist_2_enable
config4.userList[1].name=maillist_2_name
config4.userList[1].value=maillist_2_value

config4.userList[2].enable=maillist_3_enable
config4.userList[2].name=maillist_3_name
config4.userList[2].value=maillist_3_value

然后,創建一個配置類Config4,用于將定義的變量映射到配置類里面。

@Component
@ConfigurationProperties(prefix = "config4")
public class Config4 {

private List<UserEntity> userList;

public List<UserEntity> getUserList() {
return userList;
}

public void setUserList(List<UserEntity> userList) {
this.userList = userList;
}
}
public class UserEntity {

private String enable;
private String name;
private String value;

//...get、set
}

讀取數據的方式,與之類似!

@RestController
public class HelloController {

@Autowired
private Config4 config4;

@GetMapping("config4")
public String config4(){
return JSON.toJSONString(config4);
}
}

2.3、通過@PropertySource注解實現配置文件加載

正如我們最開始所介紹的,很多時間,我們希望將配置文件分卡寫,比如zookeeper組件對應的服務配置文件是zookeeper.properties,redis組件對應的服務配置文件是redis.properties等等。

這種自定義的配置文件,我們應該如何加載到Spring容器里面呢?

其實方法也很簡單,通過@PropertySource就可以實現!

首先,我們在resources資源文件夾下,創建兩個配置文件test.properties和bussiness.properties,內容如下!

test.properties文件內容:

aaa.a1=aa1123
aaa.a2=aa2123
aaa.a3=aa3123
aaa.a4=aa4123

bussiness.properties文件內容:

bbbb.a1=bb1123
bbbb.a2=bb2123
bbbb.a3=bb3123
bbbb.a4=bb4123

在SpringBoot啟動類上加載配置文件即可!

@SpringBootApplication
@PropertySource(value = {"test.properties","bussiness.properties"})
public class PropertyApplication {

public static void main(String[] args) {
SpringApplication.run(PropertyApplication.class, args);
}
}

讀取數據的方式,與之類似!

@RestController
public class HelloController {

@Value("${aaa.a2}")
private String a2;

@Value("${bbbb.a1}")
private String bbbbA1;

@GetMapping("a2")
public String a2(){
return JSON.toJSONString(a2);
}

@GetMapping("bbbbA1")
public String bbbbA1(){
return JSON.toJSONString(bbbbA1);
}
}

如果我們只是在業務中需要用到自定義配置文件的值,這樣引入并沒有什么問題;但是如果某些自定義的變量,在項目啟動的時候需要用到,這種方式會存在一些問題,原因如下:

翻譯過來的意思就是說:

雖然在@SpringBootApplication上使用@PropertySource似乎是在環境中加載自定義資源的一種方便而簡單的方法,但我們不推薦使用它,因為SpringBoot在刷新應用程序上下文之前就準備好了環境。使用@PropertySource定義的任何鍵都加載得太晚,無法對自動配置產生任何影響。

因此,如果某些參數是啟動項變量,建議將其定義在application.properties或application.yml文件里面,這樣就不會有問題!

或者,采用【自定義環境處理類】來實現配置文件的加載!

2.4、通過自定義環境處理類,實現配置文件的加載

實現方法也很簡單,首先,創建一個實現自EnvironmentPostProcessor接口的類,然后自行加載配置文件。

public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {


@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
//自定義配置文件
String[] profiles = {
"test.properties",
"bussiness.properties",
"blog.yml"
};

//循環添加
for (String profile : profiles) {
//從classpath路徑下面查找文件
Resource resource = new ClassPathResource(profile);
//加載成PropertySource對象,并添加到Environment環境中
environment.getPropertySources().addLast(loadProfiles(resource));
}
}

//加載單個配置文件
private PropertySource<?> loadProfiles(Resource resource) {
if (!resource.exists()) {
throw new IllegalArgumentException("資源" + resource + "不存在");
}
if(resource.getFilename().contains(".yml")){
return loadYaml(resource);
} else {
return loadProperty(resource);
}
}

/**
* 加載properties格式的配置文件
* @param resource
* @return
*/
private PropertySource loadProperty(Resource resource){
try {
//從輸入流中加載一個Properties對象
Properties properties = new Properties();
properties.load(resource.getInputStream());
return new PropertiesPropertySource(resource.getFilename(), properties);
}catch (Exception ex) {
throw new IllegalStateException("加載配置文件失敗" + resource, ex);
}
}

/**
* 加載yml格式的配置文件
* @param resource
* @return
*/
private PropertySource loadYaml(Resource resource){
try {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource);
//從輸入流中加載一個Properties對象
Properties properties = factory.getObject();
return new PropertiesPropertySource(resource.getFilename(), properties);
}catch (Exception ex) {
throw new IllegalStateException("加載配置文件失敗" + resource, ex);
}
}
}

接著,在resources資源目錄下,我們還需要創建一個文件META-INF/spring.factories,通過spi方式,將自定義環境處理類加載到Spring處理器里面,當項目啟動時,會自動調用這個類!

#啟用我們的自定義環境處理類
org.springframework.boot.env.EnvironmentPostProcessor=com.example.property.env.MyEnvironmentPostProcessor

這種自定義環境處理類方式,相對會更佳靈活,首先編寫一個通用的配置文件解析類,支持properties和yml文件的讀取,然后將其注入到Spring容器里面,基本上可以做到一勞永逸!

2.5、最后,我們來介紹一下yml文件讀取

在上文中,我們大部分都是以properties為案例進行介紹,可能有的人已經踩過坑了,在項目中使用@PropertySource注解來加載yml文件,結果啟動直接報錯,原因是@PropertySource不支持直接解析yml文件,只能解析properties文件。

那如果,我想單獨解析yml文件,也不想弄一個【自定義環境處理類】這種方式來讀取文件,應該如何處理呢?

操作方式也很簡單,以自定義的blog.yml文件為例!

blog.yml文件內容:

pzblog:
name: helloWorld

然后,創建一個讀取yml文件的配置類

@Configuration
public class ConfigYaml {

/**
* 加載YML格式自定義配置文件
* @return
*/
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("blog.yml"));
configurer.setProperties(yaml.getObject());
return configurer;
}
}

讀取數據的方式,與之類似!

@RestController
public class HelloController {

@Value("${pzblog.name}")
private String pzblogName;

@GetMapping("pzblogName")
public String pzblogName(){
return JSON.toJSONString(pzblogName);
}
}

三、小結

本文主要圍繞 SpringBoot 加載配置文件的幾種實現方式,做了一次內容總結,如果有遺漏的地方,歡迎網友批評指出!

四、參考

1、springBoot 官方文檔

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2011-10-26 19:57:33

2019-06-19 08:30:47

網絡協議IPTCP

2023-01-06 09:40:20

項目性能

2020-06-08 10:50:58

前端TypeScript代碼

2022-06-28 07:31:11

哨兵模式redis

2021-05-26 16:12:20

區塊鏈加密貨幣比特幣

2022-09-23 08:32:53

微服務架構服務

2023-09-02 21:14:32

2022-07-06 08:17:50

C 語言函數選型

2021-11-04 08:16:50

MySQL SQL 語句數據庫

2019-05-20 07:37:00

TCPIP網絡協議

2018-01-17 22:36:46

區塊鏈數字貨幣比特幣

2021-05-30 19:02:59

變量對象上下文

2018-03-11 15:11:38

物聯網數據物聯網數據

2021-05-25 09:50:01

GitLinux命令

2021-05-13 13:20:00

Git命令Linux

2018-03-05 08:35:12

物聯網互聯網網絡技術

2018-03-11 14:57:07

物聯網組網無線通信

2018-03-29 06:40:26

物聯網

2018-01-18 17:14:58

分布式文件系統FastDFS
點贊
收藏

51CTO技術棧公眾號

妺妺窝人体色777777| 欧美精品福利在线| 午夜两性免费视频| av在线官网| 波多野洁衣一区| 国产精品久久久久久久久久| 波多野结衣家庭教师| 日韩av字幕| 91精品午夜视频| 99精品在线免费视频| 久草免费在线| 久久青草国产手机看片福利盒子| 成人午夜小视频| 日韩免费一级片| av在线不卡顿| 亚洲国产精久久久久久| 日韩福利视频在线| 成av人片在线观看www| 欧美成人资源| 热久久久久久久| 91禁国产网站| 欧美极品视频在线观看| 欧美最新另类人妖| 亚洲精品www| 一级黄色片国产| 欧美不卡高清一区二区三区| 亚洲成人动漫在线观看| 一级全黄肉体裸体全过程| 你懂的在线播放| 成人av午夜电影| 91视频国产一区| 人妻中文字幕一区二区三区| 国产日本精品| 久久久久久久国产精品视频| 国产稀缺精品盗摄盗拍| 欧美日韩精品一区二区视频| 日韩精品中文字幕视频在线| 亚洲精品无码一区二区| 奇米一区二区| 一区福利视频| 国产精品国模大尺度视频| 久久精品国产美女| 亚洲国产成人一区二区| 久草在线在线精品观看| 国产精品精品视频一区二区三区| 天天做天天爱夜夜爽| 欧美国产三级| 欧美国产精品va在线观看| 男人晚上看的视频| 91日韩在线| 久久精品最新地址| 日本 欧美 国产| 久久久五月天| 伦伦影院午夜日韩欧美限制| 亚洲精品国产精品乱码在线观看| 成人动漫免费在线观看| 日韩在线观看免费网站| 懂色av蜜臀av粉嫩av永久| 99久久久久| 国产精品一二三四| 最好看的2019年中文视频| 女人又爽又黄免费女仆| 国产中文精品久高清在线不| 中文字幕亚洲综合久久| 91大神福利视频| 99精品视频在线观看播放| 久久精品国亚洲| 男人的天堂久久久| 国产精品大片| 91精品国产高清自在线看超| 中文在线第一页| 久久国产免费| 国产一区红桃视频| 国产色视频在线| 国产成人亚洲精品狼色在线| 国产在线精品一区二区三区》| 婷婷丁香花五月天| 国产视频不卡一区| 午夜啪啪免费视频| aa国产成人| 日本精品一区二区三区高清| 色婷婷狠狠18| 日韩精品久久久久久久软件91| 日韩精品一区二区三区中文不卡| 在线黄色免费网站| 精品国产一区二区三区香蕉沈先生 | 成人永久免费视频| 久久久久久精| 1024视频在线| 亚洲成人一区二区在线观看| 欧美日韩亚洲一二三| 日韩美女在线| 亚洲精品xxxx| 一级性生活免费视频| 亚洲黄色一区| 国产精品一区专区欧美日韩| 丰满人妻一区二区| 久久久欧美精品sm网站| 日本成人性视频| 97成人资源| 欧美一级在线免费| 日韩在线免费观看av| 亚洲女同中文字幕| 庆余年2免费日韩剧观看大牛| 国产精品美女一区| 久久午夜色播影院免费高清 | 超碰国产在线观看| 亚洲线精品一区二区三区| 手机看片福利盒子久久| 国产无遮挡裸体免费久久| 色偷偷av一区二区三区| 精品免费囯产一区二区三区| 国产在线视频一区二区| 天天爽天天狠久久久| jizzjizz中国精品麻豆| 91麻豆精品国产综合久久久久久| 少妇饥渴放荡91麻豆| 欧美精品1区| 成人妇女淫片aaaa视频| 久久久久久久久亚洲精品| 亚洲欧美福利一区二区| 簧片在线免费看| 亚洲成aⅴ人片久久青草影院| 美女少妇精品视频| 亚洲在线视频播放| 国产日本亚洲高清| 99福利在线观看| 久久狠狠久久| 欧美精品18videosex性欧美| 99国产在线播放| 国产精品久久久久影院亚瑟| 国产美女三级视频| 久久91在线| 国外色69视频在线观看| 亚洲爆乳无码一区二区三区| 亚洲免费观看高清完整版在线观看| 天堂av在线网站| 国产日产精品一区二区三区四区的观看方式 | 欧美日韩在线观看一区二区三区| 男人的天堂免费在线视频| 欧美不卡一区二区| 日本福利片在线观看| 久久成人久久爱| 亚洲国产精品视频一区| 精品裸体bbb| 中文字幕精品在线| 在线播放国产一区| 国产精品蜜臀av| 亚洲美女性囗交| 一个色综合网| 91免费看网站| 美女精品视频| 日韩hd视频在线观看| 久久国产视频精品| 久久久国产精品午夜一区ai换脸| www日韩在线观看| 成人av动漫在线观看| 国产精品最新在线观看| 久久bbxx| 欧美成人艳星乳罩| 国产又色又爽又黄的| 久久综合色8888| 好男人www社区| 国产精品成人av| 99热99热| 成人性生活视频| 自拍偷拍亚洲欧美| 精品国产999久久久免费| 亚洲综合久久久久| 欧美多人猛交狂配| 久99久精品视频免费观看| 热久久最新网址| 秋霞蜜臀av久久电影网免费| 国产成人精品久久| 久久亚洲天堂| 亚洲精品99久久久久| 男人天堂视频在线| 亚洲另类在线制服丝袜| 亚洲欧美日韩偷拍| 日韩专区欧美专区| 老汉色影院首页| 欧美成人一区在线观看| 国产精品视频白浆免费视频| www.在线视频| 亚洲欧美日韩在线高清直播| 亚洲图片小说视频| 亚洲国产中文字幕| 久久丫精品忘忧草西安产品| 国产一区二区视频在线| 国产伦精品一区二区三区四区视频_| 精品高清在线| 国产91亚洲精品一区二区三区| 欧美电影h版| 欧美尺度大的性做爰视频| 涩涩视频在线观看免费| 欧美肥妇毛茸茸| 国产又黄又猛又粗又爽| 综合欧美亚洲日本| 精品人妻互换一区二区三区| 国产精品香蕉一区二区三区| 88av.com| 香蕉精品999视频一区二区| 国产精品无码乱伦| 九热爱视频精品视频| 91久久精品国产91久久性色tv| 日韩在线短视频| 国内精品久久久| 超碰最新在线| 中文字幕亚洲二区| 蜜芽tv福利在线视频| 欧美va亚洲va在线观看蝴蝶网| 中文字幕日日夜夜| 欧美性xxxxx| 久久精品国产亚洲AV无码男同| 国产精品久久久久久久久免费桃花 | 国语自产精品视频在线看抢先版结局| 久久久久久一区二区三区| 日本暖暖在线视频| 亚洲欧美日韩一区在线| 亚洲色图欧美视频| 精品国一区二区三区| 国产美女www爽爽爽视频| 欧美这里有精品| www欧美在线| 午夜电影一区二区三区| 久久综合成人网| 一区二区三区四区乱视频| 小向美奈子av| 国产精品久久久久久久蜜臀| 91网站免费入口| 久久精品一区二区三区四区| av网站免费在线播放| aaa亚洲精品一二三区| 亚洲少妇一区二区三区| 国产成人亚洲综合a∨猫咪| 无码人妻一区二区三区在线视频| 久久99在线观看| 在线观看免费av网址| 极品少妇xxxx精品少妇偷拍 | 男人天堂2024| 欧美日韩在线一区| 国产在线观看99| 亚洲午夜久久久久久久久电影网| 久草免费新视频| 亚洲国产精品欧美一二99| 久草网视频在线观看| 亚洲香肠在线观看| 日韩黄色在线视频| 日韩欧美精品在线观看| 国产精品一区无码| 欧美性受极品xxxx喷水| 伊人网站在线观看| 欧美群妇大交群中文字幕| 国产精品欧美激情在线| 日韩午夜激情电影| 亚洲男女视频在线观看| 亚洲精品v天堂中文字幕| 日本福利片在线| 中文字幕日韩精品在线观看| 黄网站在线播放| 欧美精品videossex88| 欧美裸体视频| 国产精品成熟老女人| 成人影院网站ww555久久精品| 97久久人人超碰caoprom欧美| 国产 日韩 欧美 综合 一区| 麻豆av一区| 99热国内精品永久免费观看| 91网站在线观看免费| 亚洲第一区色| 精品久久久久久久无码| 黄色日韩网站视频| 欧美夫妇交换xxx| 国产喂奶挤奶一区二区三区| 成人信息集中地| 亚洲伊人色欲综合网| 在线免费黄色av| 欧美精品日韩一区| 可以免费观看的毛片| 亚洲欧美精品在线| 成人福利片网站| 2020久久国产精品| 电影91久久久| 久久久久久九九| 综合天堂av久久久久久久| 久久国产亚洲精品无码| 久久精品国产精品亚洲精品| 性久久久久久久久久久| 中文字幕av一区二区三区免费看| 日本老熟俱乐部h0930| 色综合久久88色综合天天免费| 99国产精品久久久久久久成人| 日韩精品视频三区| 黄色一级大片在线免费看产| 欧美亚洲成人免费| 精品一区二区三区四区五区| 欧美极品一区二区| 亚洲综合色网| 成人性生生活性生交12| 国产成人av影院| 男人天堂资源网| 欧美视频免费在线观看| 99久久免费国产精精品| 亚洲人成网站777色婷婷| 免费在线观看av电影| 国产精品网红直播| 香蕉精品久久| 丝袜人妻一区二区三区| 精品系列免费在线观看| www.自拍偷拍| 亚洲国产中文字幕在线视频综合| 91久久久久国产一区二区| 亚洲男人天天操| 手机在线观看av| 高清av免费一区中文字幕| 婷婷综合五月| 一起操在线视频| 亚洲国产高清aⅴ视频| 久久精品一二区| 亚洲第一天堂无码专区| av网址在线| 国产中文日韩欧美| 欧美亚洲高清| 日本新janpanese乱熟| 91看片淫黄大片一级在线观看| 黄色一级片在线| 日韩一区二区三区精品视频| 毛片在线播放a| 国产精品视频色| 精品久久影视| 日韩免费高清在线| 国产婷婷色一区二区三区在线| 久热这里只有精品6| 日韩精品视频免费| 悠悠资源网亚洲青| 免费不卡亚洲欧美| 六月丁香综合| 国产激情在线免费观看| 色综合天天综合给合国产| 色视频免费在线观看| 欧美专区在线观看| 国产成人高清| 浓精h攵女乱爱av| 中文字幕av不卡| 91九色蝌蚪91por成人| 色婷婷**av毛片一区| 国产不卡精品在线| 成人午夜视频免费观看| 成人性视频免费网站| 国产精品.www| 日韩美女av在线| 日韩av超清在线观看| 亚洲在线欧美| 国产一区二区三区免费在线观看| 亚洲天堂一级片| 欧美videos大乳护士334| 欧美男人天堂| 视频一区视频二区视频| 青娱乐精品视频| 丁香花五月激情| 亚洲电影免费观看高清完整版在线观看 | 午夜精品福利电影| 亚洲日本三级| 国产精品区在线| 一区二区三区在线视频免费| 欧美视频xxx| 国产国语videosex另类| 91亚洲成人| 无码人妻精品一区二区三| 一本到一区二区三区| 婷婷在线视频| 国产精品美女黄网| 久久免费黄色| 亚洲欧美精品aaaaaa片| 欧美成人一区二区三区在线观看| 女厕盗摄一区二区三区| 先锋影音日韩| 岛国精品在线观看| 欧美成人一区二区三区四区| 精品久久久91| 欧美天堂社区| 国产成人美女视频| 亚洲国产毛片aaaaa无费看| 国产中文字幕在线播放| 51午夜精品| 日韩精品国产欧美| 久热精品在线观看| 在线日韩欧美视频| 中文字幕一区日韩精品| 在线观看的毛片| 亚洲一区影音先锋| yes4444视频在线观看| 国产精品一区二区三区观看| 日韩国产精品久久久久久亚洲| 午夜69成人做爰视频| 亚洲色图av在线| 8848成人影院| 奇米视频888| 日韩欧美在线视频观看| 色噜噜狠狠狠综合欧洲色8|