SpringBoot?配置文件總結(jié)
前言
Spring Boot 中提供一個(gè)全局的配置文件:application.properties
,這個(gè)配置文件的作用就是,允許我們通過(guò)這個(gè)配置文件去修改 Spring Boot 自動(dòng)配置的默認(rèn)值。
Spring Boot 支持兩種格式的配置文件:application.properties
和 application.yml
。
yml 等同于 yaml
,寫法看個(gè)人喜歡,我喜歡寫成 application.yml
不同后綴不同寫法
application.properties
和 application.yml
,它們的區(qū)別在于語(yǔ)法不同,但本質(zhì)上是一樣的。application.properties
使用鍵值對(duì)的方式來(lái)配置,而 application.yml
使用縮進(jìn)和冒號(hào)的方式來(lái)配置。
properties
properties 作為后綴的配置文件,語(yǔ)法是這樣的:key = value
,如果有多級(jí)配置項(xiàng),則是 first.second.third = value
。
key=value first.second.third=value
示例:
- 定義屬性:
key=value game.name=GTA5
這里的 key
和 game.name
都是屬性名稱,而 value
和 GTA5
是屬性的值。
- 定義 List:
game.list=GTA5,NBA2K,AC
這里的 game.list
這個(gè)列表包含了 3 個(gè)元素。
- 定義 Map:
game.map.key1=value1 game.map.key2=value2
這里的 game.map
是一個(gè) Map,這個(gè) Map 包含了兩個(gè)元素,key1 映射到 value1,key2 映射到 value2
- 引用已定義的屬性:
game.name=GTA5 # 引用上面已定義的屬性 great.game=${game.name}
yml (yaml)
yml 作為后綴的配置文件,語(yǔ)法是這樣的:key: value
。使用冒號(hào)代替等號(hào),同時(shí)冒號(hào)后面需要跟上一個(gè)空格符,不可省略。
key: value first: second: third: value
示例:
- 定義屬性:
key: value game: name: GTA5
- 定義 List:
game: list: - GTA5 - NBA2K - AC
- 定義 Map:
game: map: key1: value1 key2: value2
- 引用已定義的屬性:
game: name: GTA5 great: game: @{game.name}
不同環(huán)境下切換不同的配置文件
一般項(xiàng)目中在不同環(huán)境下都有不同的配置,還是以這個(gè) Tomcat 的端口號(hào)為例:
目前有 3 個(gè)環(huán)境,分別是開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境。在開(kāi)發(fā)環(huán)境下,端口號(hào)是 4790;測(cè)試環(huán)境下,端口號(hào)是 4791;生產(chǎn)環(huán)境下是 4792。
application-dev.yml
server: port: 4790
application-test.yml
server: port: 4791
application-prod.yml
server: port: 4792
spring.profiles.active
現(xiàn)在,通過(guò) spring.profiles.active
這個(gè)配置項(xiàng),在 application.yml
中指定我們想要切換的配置文件,現(xiàn)在指定使用開(kāi)發(fā)環(huán)境的配置文件:
# 指定使用 application-dev.yml 這個(gè)配置文件 spring: profiles: active: dev
啟動(dòng) Spring Boot 應(yīng)用,控制臺(tái)輸出:
2023-03-16 15:41:48.122 INFO 3356 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 4790 (http) with context path ''
指定使用測(cè)試環(huán)境下的配置文件:
# 指定使用 application-test.yml 這個(gè)配置文件 spring: profiles: active: test
啟動(dòng) Spring Boot 應(yīng)用,控制臺(tái)輸出:
2023-03-16 15:42:21.462 INFO 24548 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 4791 (http) with context path ''
同理,指定使用生產(chǎn)環(huán)境的配置文件也是一樣的做法。
自定義的配置
在 Spring Boot 項(xiàng)目中,自定義配置是經(jīng)常用到的,我目前體會(huì)到的自定義的配置的作用有一點(diǎn):配置與代碼解耦
下面,我們看看如何自定義配置,并使用自己自定義配置的值:
server: port: 4790 # 自定義的配置 demo: author: god23bin description: 點(diǎn)個(gè)免費(fèi)的贊,我能開(kāi)心好久!
上面自定義了兩個(gè)配置項(xiàng),分別是 demo.author
和 demo.description
,接著,如何在代碼中使用這些配置好的值呢?
目前使用這些配置好的值(讀取這些值),有以下幾種方式:
- 使用
@Value
- 使用
@ConfigurationProperties
@Value
我們寫一個(gè)普通的 Java 類,使用 Spring 提供的 @Value
來(lái)讀取這兩個(gè)值:
@Data @Component public class DemoCustomConfig { /** * 通過(guò) @Value 注解讀取配置文件中的自定義配置項(xiàng)的值,使用 ${} 進(jìn)行讀取 **/ @Value("${demo.author}") private String author; @Value("${demo.description}") private String description; }
上面的代碼中,我在類上使用了 @Data
和 @Component
,@Data
是來(lái)自 Lombok 的,用于生成 getter 和 setter 方法,@Component
則將該類的實(shí)例對(duì)象交給 Spring 管理,接著在該類的兩個(gè)屬性上分別使用了 @Value
注解,通過(guò) ${}
指定了我們要讀取的配置項(xiàng)。
進(jìn)行測(cè)試,我們寫一個(gè) Controller 判斷我們的讀取是否成功:
@RequestMapping("/demo") @RestController public class DemoController { @Autowired private DemoCustomConfig demoCustomConfig; @GetMapping("/getCustomValue") public ResponseEntity<String> getCustomValue() { return ResponseEntity.ok(demoCustomConfig.getAuthor() + "說(shuō):" + demoCustomConfig.getDescription()); } }
訪問(wèn)該接口:localhost:4790/demo/getCustomValue
@ConfigurationProperties
@ConfigurationProperties
注解,它可以將配置文件中的的值綁定到 Java Bean 中,也就是通過(guò)這個(gè) Bean 可以讀取到配置文件中配置的值,我們看看如何操作。
我們自定義一個(gè)用于讀取配置文件中配置項(xiàng)的類:
@Data @Component @ConfigurationProperties("system.demo") public class SystemCustomConfig { private String name; private String version; }
上面的代碼,主要使用了 @ConfigurationProperties
這個(gè)注解,并指定了前綴 system.demo
,同時(shí)這個(gè)類有兩個(gè)屬性,name 和 version, 這樣就相當(dāng)于我們自定義了 system.demo.name
和 system.demo.version
這兩個(gè)屬性。
接著,我們就能在配置文件中寫這兩個(gè)我們自定義的配置項(xiàng)了:
server: port: 4790 # 自定義的配置 system: demo: name: 超級(jí)系統(tǒng) version: 1.0
寫完這里的配置項(xiàng),并不需要使用 @Value
去讀取,因?yàn)槭褂昧?nbsp;@ConfigurationProperties
注解,Spring 已經(jīng)幫我們搞定了配置的值的讀取,至于它的實(shí)現(xiàn)原理,這里先不深究。
進(jìn)行測(cè)試,依然通過(guò)寫一個(gè)接口來(lái)測(cè)試我們通過(guò):
@RequestMapping("/demo") @RestController public class DemoController { @Autowired private SystemCustomConfig systemCustomConfig; @GetMapping("/getSystemVersion") public ResponseEntity<String> getSystemVersion() { return ResponseEntity.ok(systemCustomConfig.getName() + "版本:" + systemCustomConfig.getVersion()); } }
訪問(wèn)該接口:localhost:4790/demo/getSystemVersion
關(guān)于自動(dòng)提示
不過(guò),目前有個(gè)問(wèn)題就是,我們自己寫了個(gè) Java Bean 后,在配置文件中寫配置項(xiàng)的時(shí)候并沒(méi)有相關(guān)提示,這個(gè)就比較不友好,如果當(dāng)我們自己寫的配置想要給其他人用的話,別人都不知道有什么配置可以配。所以想要能像 Spring Boot 提供的配置提示一樣的話,就需要引入下面的依賴:
<!-- 配置文件處理器,配置文件進(jìn)行綁定就會(huì)有提示 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
spring-boot-configuration-processor
是一個(gè)用于生成配置元數(shù)據(jù)的注解處理器。它會(huì)掃描使用@ConfigurationProperties
注解的類和方法,來(lái)獲取配置參數(shù)并生成配置元數(shù)據(jù)。生成的配置元數(shù)據(jù)可以用于 IDE 的自動(dòng)補(bǔ)全和提示功能。
如果你引入了這個(gè)依賴并且重啟該 Spring Boot 項(xiàng)目后,依舊沒(méi)有提示的話,嘗試開(kāi)啟 IDEA 中的 annotaion processing
。
關(guān)于 Cannot resolve configuration property
對(duì)于我們自定義的配置,會(huì)出現(xiàn)這樣的提示:Cannot resolve configuration property(無(wú)法處理自定義的配置屬性),如下:
解決方式就是定義一下元數(shù)據(jù),用元數(shù)據(jù)來(lái)描述這個(gè)屬性。當(dāng)我們移動(dòng)到這個(gè)配置項(xiàng)上時(shí),出現(xiàn)提示,我們直接點(diǎn)擊 Define configuration key xxx
就可以幫我們生成一個(gè)關(guān)于配置的元數(shù)據(jù)文件。
additional-spring-configuration-metadata.json
:
{ "properties": [ { "name": "demo.author", "type": "java.lang.String", "description": "Demo的作者" }, { "name": "demo.description", "type": "java.lang.String", "description": "Demo的描述" } ] }
此時(shí),還是一樣,重啟項(xiàng)目,如果黃色提示還是沒(méi)有去除的話,這里建議重新用 Maven 進(jìn)行一次 clean,接著重新編譯整個(gè)項(xiàng)目,就可以了。于此同時(shí),也具有了自動(dòng)提示功能。
自定義配置文件
上面說(shuō)的是自定義的配置,現(xiàn)在這里說(shuō)自定義的配置文件,我們知道 Spring Boot 默認(rèn)提供 application.properties
這個(gè)配置文件。那現(xiàn)在我們想自己寫一個(gè)配置文件,并且能在應(yīng)用中讀取這個(gè)配置文件的信息,該如何做呢?這里就涉及到 @PropertySource
這個(gè)注解了。
自定義的配置文件:
custom.yml
:
# 自定義的配置文件 version: 2.0 description: 求關(guān)注!
讀取該配置文件的配置類:
@Data @Configuration @PropertySource("classpath:custom.yml") public class DemoPropertiesSourceConfig { @Value("${version}") private String version; @Value("${description}") private String description; }
這樣,就能讀取到自己編寫的配置文件的配置信息了。
如果有多個(gè)自定義的配置文件,那么可以使用 @PropertySources
注解,可以看到最后面多加了一個(gè) s
,說(shuō)明這個(gè)單詞是復(fù)數(shù),通俗易懂。
@Configuration @PropertySources({ @PropertySource("classpath:custom1.yml"), @PropertySource("classpath:custom2.properties") }) public class MyConfig { // ... }
總結(jié)
配置文件的兩種寫法:properties 和 yml
項(xiàng)目中存在多個(gè)配置文件,可以使用
spring.profiles.active
屬性來(lái)切換使用哪個(gè)配置文件。自定義的一些配置屬性(配置項(xiàng)),如何讀取呢?可以在程序中通過(guò)
@Value
或者@ConfigurationProperties
來(lái)讀取。自定義的配置文件,可以通過(guò)
@PropertySource
來(lái)指定獲取該自定義配置文件的信息。
以上就是SpringBoot 配置文件總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot 配置文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
完美解決Logback configuration error detected的問(wèn)題
這篇文章主要介紹了完美解決Logback configuration error detected的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的圖文教程
這篇文章主要介紹了idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07詳解JAVA中的Collection接口和其主要實(shí)現(xiàn)的類
這篇文章主要介紹了JAVA中的Collection接口和其主要實(shí)現(xiàn)的類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Java同步框架AbstractQueuedSynchronizer詳解
本篇文章主要介紹了Java同步框架AbstractQueuedSynchronizer詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10將Java項(xiàng)目打包成可執(zhí)行的jar包
這篇文章主要介紹了將Java項(xiàng)目打包成可執(zhí)行的jar包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06