成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot外化配置源碼解析:綜合實(shí)戰(zhàn)演示參數(shù)及配置

開(kāi)發(fā) 前端
本章我們講解了關(guān)于 Spring Boot 外化配置的原理及源碼分析,本節(jié)我們通過(guò)一個(gè)具體的例子來(lái)簡(jiǎn)單演示在 Spring Boot 中如何使用不同類(lèi)型的參數(shù)及配置。本節(jié)實(shí)例涉及的部分新知識(shí)點(diǎn)我們也會(huì)進(jìn)行簡(jiǎn)單介紹和拓展。

綜合實(shí)戰(zhàn)

本章我們講解了關(guān)于 Spring Boot 外化配置的原理及源碼分析,本節(jié)我們通過(guò)一個(gè)具體的例子來(lái)簡(jiǎn)單演示在 Spring Boot 中如何使用不同類(lèi)型的參數(shù)及配置。本節(jié)實(shí)例涉及的部分新知識(shí)點(diǎn)我們也會(huì)進(jìn)行簡(jiǎn)單介紹和拓展。

在本節(jié)實(shí)例中,我們會(huì)用到命令行傳遞參數(shù)、默認(rèn)配置文件 application.properties 及基于profile 配置參數(shù)、@Value 注解獲取參數(shù)、 基于類(lèi)型安全的@ConfigurationProperties 注解關(guān)聯(lián) Bean 等功能。

由于 Spring Boot 已經(jīng)對(duì)外化配置進(jìn)行了簡(jiǎn)化處理,對(duì)照此前章節(jié)中相關(guān)原理的介紹,我們?cè)趯?shí)踐中使用起來(lái)是非常方便的。這里我創(chuàng)建了一個(gè)標(biāo)準(zhǔn)的 Spring Boot 項(xiàng)目,版本采用2.2.1.RELEASE。首先我們看一下項(xiàng)目的目錄結(jié)構(gòu)。

 

SpringBoot外化配置源碼解析:綜合實(shí)戰(zhàn)演示參數(shù)及配置

在 pom.xml 中引入的核心依賴(lài)為 spring-boot-starter-web,對(duì)應(yīng)依賴(lài)源碼如下。

  1. <dependency> 
  2. <groupId>org. springframework . boot</ groupId> 
  3. <artifactId>spring- boot- starter-web</artifactId> 
  4. </ dependency> 

SpringbootConfigApplication 類(lèi)為 Spring Boot 項(xiàng)目的啟動(dòng)類(lèi),我們不再做過(guò)多介紹。

ConfigController類(lèi)為接收請(qǐng)求的 Controller, 在 其內(nèi)部定義了 一 個(gè) 默 認(rèn) 的getConfigParams 方法,在該方法內(nèi)打印了不同途徑獲得的參數(shù)值,相關(guān)源碼如下。

 

  1. @RestController 
  2. public class ConfigController { 
  3. @Value( "${user . username}"
  4. private String username ; 
  5. @Value("${user . password}"
  6. private String password
  7. @Resource 
  8. private LoginUserConfig loginUserConfig; 
  9. @Value("${projectName :unknown}"
  10. private String projectName ; 
  11. @RequestMapping("/"
  12. public String getConfigParams() { 
  13. //啟動(dòng)命令傳遞參數(shù) 
  14. System. out . println("Command config projectName:" + projectName);//通過(guò) appl ication 配置文件配置的參數(shù) 
  15. System. out . println("Application config Username 
  16. System. out . println("Application config Password :”+ password); 
  17. //通過(guò)@ConfigurationProperties 注解配置的參數(shù) 
  18. System. out. println("ConfigurationProperties config Username :”+ login 
  19. UserConfig. 
  20. getUsername()); 
  21. System . out . println("Configurat ionProperties config Password :”+ login 
  22. UserConfig. 
  23. getPassword()); 
  24. return ""

其中通過(guò)@RestController 注解指定該類(lèi)為可接收請(qǐng)求的 Controller,并進(jìn)行實(shí)例化。在該類(lèi)內(nèi)部分 別通過(guò)@Value 注解、@Resource 注解來(lái) 獲取不同途徑 設(shè)置的參數(shù)。 通過(guò)getConfigParams 方法對(duì)外提供訪(fǎng)問(wèn)請(qǐng)求, 當(dāng)前接收到請(qǐng)求之后會(huì)打印不同途徑獲得參數(shù)的值。

首先我們來(lái)看通過(guò)@Value 獲取到的值的來(lái)源,在該實(shí)例中有兩個(gè)途徑來(lái)設(shè)置對(duì)應(yīng)的值:

application.properties 配置文件和命令行參數(shù)。

關(guān)于命令行參數(shù),我們之前也已經(jīng)提到過(guò),基本傳遞方式就是在執(zhí)行啟動(dòng)項(xiàng)目的命令時(shí)通過(guò)“一 name=value' 的形式進(jìn)行傳遞。結(jié)合并實(shí)例,傳遞方式如下。

  1. java -jar springboot-config-0. 0.1- SNAPSHOT. jar -- projectName=SpringBoot 

在 ConfigController 類(lèi)中,我們可以看到@Value 的使用基本格式為@Value("${param}"),但針對(duì)命令行參數(shù)獲取時(shí)我們采用了@Value("${param:default}")方式。在實(shí)踐中這兩種方式都比較常用,而第二種通過(guò)冒號(hào)分隔符進(jìn)行傳遞默認(rèn)值,當(dāng) param 參數(shù)不存在或未在application 中配置時(shí),會(huì)使用指定的默認(rèn)值。

以當(dāng)前實(shí)例為例,如果啟動(dòng)命令中未指定 projectName 參數(shù),同時(shí)@Value 獲取時(shí)也未指定默認(rèn)值"unknown",那么在執(zhí)行啟動(dòng)命令時(shí)便會(huì)拋出異常無(wú)法啟動(dòng)。這是我們?cè)谑褂聾Value的過(guò)程中需要注意的一種情況。

關(guān)于 application.properties 配置文件中參數(shù)的設(shè)置更簡(jiǎn)單,直接在對(duì)應(yīng)文件中設(shè)置對(duì)應(yīng)的key=value 值即可,比如本例中 application.properties 中的配置源碼如下。

 

  1. #公共配置,任何環(huán)境啟動(dòng)均采用 8080 端 
  2. server. port=8080 
  3. spring. profiles . active=dev 

但在實(shí)踐的過(guò)程中,我們經(jīng)常會(huì)遇到不同環(huán)境需要不同配置文件的情況,如果每換一-個(gè)環(huán)境就重新修改配置文件或重新打包一次會(huì)比較麻煩,這時(shí)就可以用 Spring Boot 提供的Profile 配置功能來(lái)解決問(wèn)題了。而我們實(shí)例中提供的 3 個(gè) properties 配置文件就是為了展示 Profile 配置的基本使用。

通常情況下,項(xiàng)目中根據(jù)環(huán)境的多少會(huì)創(chuàng)建 1 個(gè)到多個(gè) properties 配置文件,一般情況下它們對(duì)應(yīng)的命名格式和相關(guān)功能如下。

  • *applcation.properties:公共配置。
  • *application-dev.properties:開(kāi)發(fā)環(huán)境配置。
  • .application-test.properties:測(cè)試環(huán)境配置。
  • application-prod.properties:生產(chǎn)環(huán)境配置。

當(dāng)然,命名中的“dev'"test 和"prod”是可以自定義的,而這些配置在什么時(shí)候會(huì)被使用,則可通過(guò)激活 application.properties 配置文件中的 spring.profiles. active 參數(shù)來(lái)控制。

比如,在 applcation.properties 中進(jìn)行公共配置, 然后通過(guò)如下配置激活指定環(huán)境的配置。

  1. spring. profiles.active = prod 

其中“prod”對(duì)照文件名中 application-prod.properties。Spring Boot 在處理時(shí)會(huì)獲取配置文件 applcation.properties, 然 后 通 過(guò) 指 定 的 profile 的 值 “prod" 進(jìn) 行 拼 接 , 獲 得application-prod.properties 文件的名稱(chēng)和路徑。 具體加載拼接的步驟和原理,我們?cè)谇懊娴恼鹿?jié)中已經(jīng)講過(guò),可對(duì)照實(shí)例回顧一下。

在上述實(shí)例中,我們激活了 dev 的配置環(huán)境,application-dev.properties 中的配置如下。

 

  1. #測(cè)試環(huán)境用戶(hù)名和賬戶(hù) 
  2. user. username=test - admin 
  3. userpassword=test-pwd 

此時(shí),通過(guò)訪(fǎng)問(wèn)對(duì)應(yīng)的請(qǐng)求,getConfigParams 方 法中對(duì)應(yīng)打印的日志如下。

 

  1. Application config 
  2. Username : test- admin 
  3. Application config Password : test - pwd 

如果想激活生產(chǎn)環(huán)境的配置,只須在 application.properties 中配置spring.profiles. active=prod 即可。

@Value 參數(shù)值的獲取和基于 Profile 的參數(shù)配置我們就拓展這么多,@Value 的使用還包括注入普通字符串、操作系統(tǒng)屬性、表達(dá)式結(jié)果、文件資源、URL 資源等內(nèi)容,大家可查閱官方文檔和相關(guān)實(shí)例進(jìn)一步學(xué)習(xí)。

在上述@Value 使用中,我們可以對(duì)單個(gè)屬性進(jìn)行注入配置,但如果有很多配置屬性或者配置屬性本身?yè)碛袑蛹?jí)結(jié)構(gòu),便顯得不夠方便靈活。因此,Spring Boo 提供了基于類(lèi)型安全的配置方式。

在 ConfigController 中我們通過(guò)@Resource 注入了一個(gè) LoginUserConfig 類(lèi),該類(lèi)便是通過(guò)@ConfigurationProperties 注解將 properties 屬性和 LoginUserConfig 的屬性進(jìn)行關(guān)聯(lián),從而實(shí)現(xiàn)類(lèi)型安全配置。LoginUserConfig 的源碼如下。

 

  1. @Component@Configurat ionProperties(prefix = "user"
  2. public class LoginUserConfig { 
  3. private String username ; 
  4. private String password
  5. //省略 getter/setter 方法 

在 LoginUserConfig 類(lèi)的源代碼中,通過(guò)@ConfigurationProperties 注解指定在實(shí)例化時(shí)將前綴為 user 的配置屬性綁定到 LoginUserConfig 類(lèi)的對(duì)應(yīng)屬性上,而通過(guò)@Component將該類(lèi)實(shí)例化。

這 里 由 于 指 定 配 置 文 件 為 dev , 則 會(huì) 將 上 述 dev 配 置 文 件 中 的 user.username 和user.password 的值分別綁定到 LoginUserConfig 類(lèi)的 username 和 password 屬性上。而在 ConfigController 中注入 之后, 便可獲 得對(duì)應(yīng)的屬 性值。同樣在 執(zhí)行請(qǐng)求時(shí) ,getConfigParams 方法中對(duì)應(yīng)打印的日志如下。

  • ConfigurationProperties config Username : test - admin
  • ConfigurationProperties config Password : test- pwd

上述實(shí)例只演示了@ConfigurationProperties 綁定屬性的一種情況,Spring Boot 將 Environment 屬性綁定到@ConfigurationProperties 標(biāo)注的 Bean 時(shí),還可以使用一些寬松的規(guī)則,也就是說(shuō) Environment 屬性名和 Bean 屬性名不需要精確匹配。

比如在對(duì)象 User 中有一-個(gè) firstName 屬性,那么在配置文件中對(duì)應(yīng)如下配置項(xiàng)均會(huì)匹配。

  • user. firstName // 標(biāo)準(zhǔn)駝峰命名語(yǔ)法
  • user. first-name // 短橫線(xiàn)隔開(kāi)表示,推薦用于. properties 和. yml 文件中
  • user. first_ name // 下劃線(xiàn)表示,用于. properties 和 yml 文件的可選格式
  • USER_ FIRST _NAME //大寫(xiě)形式,推薦用于系統(tǒng)環(huán)境變量

同時(shí),基于類(lèi)型安全的屬性配置還可以結(jié)合@Validated 注解進(jìn)行屬性的約束校驗(yàn),比如判斷是否非空、是否是正確的手機(jī)號(hào)(郵箱)格式、是否是正確的日期等,這里就不進(jìn)行展開(kāi)了。

大家可以結(jié)合本實(shí)例嘗試拓展。

最后,我們?cè)僬w回顧一-下本節(jié)實(shí)例的重 點(diǎn)內(nèi)容,首先基于 Profile 機(jī)制我們?cè)O(shè)定了多個(gè)環(huán)境的配置文件;然后通過(guò) spring. profiles. active 配置指定具體使用哪些環(huán)境的參數(shù)值;接著通過(guò)@Value 和@ConfigurationProperties 注解將這些配置屬性綁定到類(lèi)屬性或 Bean 對(duì)象上;最后在具體的場(chǎng)景中獲取并使用(本實(shí)例為打印)。

在具體實(shí)踐中我們還會(huì)遇到優(yōu)先級(jí)的問(wèn)題,比如某些參數(shù)直接通過(guò)命令行參數(shù)進(jìn)行指定,那么它將覆蓋同名的配置文件中的參數(shù)。再比如,如果將 application 配置文件放置在項(xiàng)目同級(jí)目錄下,它的優(yōu)先級(jí)高于 jar 包內(nèi)的配置等。這些內(nèi)容我們?cè)谠砥加猩婕?,讀者可參考本實(shí)例進(jìn)行逐一驗(yàn)證學(xué)習(xí)。

小結(jié)

本章重點(diǎn)介紹了 Spring Boot 中參數(shù)的傳遞過(guò)程和配置文件的加載,特別是基于 profile 的加載機(jī)制。而關(guān)于加載、默認(rèn)配置、配置優(yōu)先級(jí)等操作,都位于 ConfigFileApplicationListener類(lèi)中,該類(lèi)還是值得讀者朋友花時(shí)間研究一下的。

實(shí)戰(zhàn)部分通過(guò)一個(gè)簡(jiǎn)單的實(shí)例演示了部分原理的使用方法,大家可結(jié)合該實(shí)例來(lái)驗(yàn)證和使用更多的相關(guān)功能。

最后,由于本章涉及源碼較多,邏輯層次較深,不同的配置模式又會(huì)形成不同的組合,形成較多的場(chǎng)景,因此建議在學(xué)習(xí)過(guò)程中通過(guò) debug 來(lái)跟蹤每一步的操作,以便能夠更好地理解整個(gè)流程。

責(zé)任編輯:未麗燕 來(lái)源: 今日頭條
相關(guān)推薦

2020-10-30 13:30:26

SpringBoot代碼應(yīng)用

2023-10-07 09:16:55

SpringBoot啟動(dòng)流程

2021-09-08 17:20:18

DockerDockerfile程序

2010-09-13 17:45:37

2024-07-29 00:00:05

2011-10-27 10:30:55

CISCO配置命令

2024-03-12 09:50:27

Raft協(xié)議KRaft

2011-04-01 16:49:25

Cisco路由器IOS

2009-12-16 16:45:56

Cisco路由器配置

2022-07-14 14:00:01

Linux命令解析

2023-11-17 09:02:51

Nacos配置中心

2019-07-09 15:10:02

Nginx反向代理負(fù)載均衡

2021-08-27 07:47:07

Nacos灰度源碼

2022-09-15 15:25:47

spring-微服務(wù)

2018-12-24 06:49:55

SDN交換機(jī)SDN網(wǎng)絡(luò)架構(gòu)

2009-12-09 09:30:07

靜態(tài)路由配置

2009-04-08 10:35:00

靜態(tài)路由配置

2009-11-17 10:36:28

路由器基礎(chǔ)配置

2011-03-03 09:34:34

PureFTPd

2010-11-29 13:33:00

sybase配置參數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91精品中文字幕一区二区三区 | 日韩欧美国产成人一区二区 | 久久精品国产亚洲一区二区三区 | 精品一区二区三区在线观看国产 | 91成人精品视频 | 国内精品久久久久久久 | 在线播放国产一区二区三区 | 国产精品久久久久久久久久久免费看 | 成人国产免费视频 | 视频在线一区 | 久久精品网 | 欧美亚洲网站 | 一区二区三区视频 | 久久99精品久久久久久噜噜 | 天天弄天天操 | 亚洲精久| 91香蕉视频在线观看 | 国产成人在线一区二区 | 国产丝袜一区二区三区免费视频 | 国产精品久久久久免费 | 久久久久久亚洲精品 | 国产精品视频不卡 | 国产亚洲成av人在线观看导航 | 国产在线精品一区二区三区 | 国产原创在线观看 | 97caoporn国产免费人人 | 国产精品日韩欧美一区二区三区 | 国产99久久| 欧美精品影院 | 狠狠操狠狠操 | 高清久久久 | 美女高潮网站 | 久久久精品一区二区 | 国内精品久久久久久 | 免费一级片 | 91视频网址 | 亚洲精品2 | 九九在线视频 | 91最新视频 | 一级全黄少妇性色生活免费看 | 一区二区三区精品视频 |