前言
Spring Boot 中提供一個全域的組態檔:application.properties,這個組態檔的作用就是,允許我們通過這個組態檔去修改 Spring Boot 自動配置的默認值,
Spring Boot 支持兩種格式的組態檔:application.properties 和 application.yml,
yml 等同于 yaml,寫法看個人喜歡,我喜歡寫成 application.yml
不同后綴不同寫法
application.properties 和 application.yml ,它們的區別在于語法不同,但本質上是一樣的,application.properties 使用鍵值對的方式來配置,而 application.yml 使用縮進和冒號的方式來配置,
properties
properties 作為后綴的組態檔,語法是這樣的:key = value,如果有多級配置項,則是 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 這個串列包含了 3 個元素,
- 定義 Map:
game.map.key1=value1
game.map.key2=value2
這里的 game.map 是一個 Map,這個 Map 包含了兩個元素,key1 映射到 value1,key2 映射到 value2
- 參考已定義的屬性:
game.name=GTA5
# 參考上面已定義的屬性
great.game=${game.name}
yml (yaml)
yml 作為后綴的組態檔,語法是這樣的:key: value,使用冒號代替等號,同時冒號后面需要跟上一個空格符,不可省略,
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}
不同環境下切換不同的組態檔
一般專案中在不同環境下都有不同的配置,還是以這個 Tomcat 的埠號為例:
目前有 3 個環境,分別是開發環境、測驗環境、生產環境,在開發環境下,埠號是 4790;測驗環境下,埠號是 4791;生產環境下是 4792,
application-dev.yml
server:
port: 4790
application-test.yml
server:
port: 4791
application-prod.yml
server:
port: 4792
spring.profiles.active
現在,通過 spring.profiles.active 這個配置項,在 application.yml 中指定我們想要切換的組態檔,現在指定使用開發環境的組態檔:
# 指定使用 application-dev.yml 這個組態檔
spring:
profiles:
active: dev
啟動 Spring Boot 應用,控制臺輸出:
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 ''
指定使用測驗環境下的組態檔:
# 指定使用 application-test.yml 這個組態檔
spring:
profiles:
active: test
啟動 Spring Boot 應用,控制臺輸出:
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 ''
同理,指定使用生產環境的組態檔也是一樣的做法,
自定義的配置
在 Spring Boot 專案中,自定義配置是經常用到的,我目前體會到的自定義的配置的作用有一點:配置與代碼解耦
下面,我們看看如何自定義配置,并使用自己自定義配置的值:
server:
port: 4790
# 自定義的配置
demo:
author: god23bin
description: 點個免費的贊,我能開心好久!
上面自定義了兩個配置項,分別是 demo.author 和 demo.description,接著,如何在代碼中使用這些配置好的值呢?
目前使用這些配置好的值(讀取這些值),有以下幾種方式:
- 使用
@Value - 使用
@ConfigurationProperties
@Value
我們寫一個普通的 Java 類,使用 Spring 提供的 @Value 來讀取這兩個值:
@Data
@Component
public class DemoCustomConfig {
/**
* 通過 @Value 注解讀取組態檔中的自定義配置項的值,使用 ${} 進行讀取
**/
@Value("${demo.author}")
private String author;
@Value("${demo.description}")
private String description;
}
上面的代碼中,我在類上使用了 @Data 和 @Component,@Data 是來自 Lombok 的,用于生成 getter 和 setter 方法,@Component 則將該類的實體物件交給 Spring 管理,接著在該類的兩個屬性上分別使用了 @Value 注解,通過 ${} 指定了我們要讀取的配置項,
進行測驗,我們寫一個 Controller 判斷我們的讀取是否成功:
@RequestMapping("/demo")
@RestController
public class DemoController {
@Autowired
private DemoCustomConfig demoCustomConfig;
@GetMapping("/getCustomValue")
public ResponseEntity<String> getCustomValue() {
return ResponseEntity.ok(demoCustomConfig.getAuthor() + "說:" + demoCustomConfig.getDescription());
}
}
訪問該介面:localhost:4790/demo/getCustomValue

@ConfigurationProperties
@ConfigurationProperties 注解,它可以將組態檔中的的值系結到 Java Bean 中,也就是通過這個 Bean 可以讀取到組態檔中配置的值,我們看看如何操作,
我們自定義一個用于讀取組態檔中配置項的類:
@Data
@Component
@ConfigurationProperties("system.demo")
public class SystemCustomConfig {
private String name;
private String version;
}
上面的代碼,主要使用了 @ConfigurationProperties 這個注解,并指定了前綴 system.demo,同時這個類有兩個屬性,name 和 version, 這樣就相當于我們自定義了 system.demo.name 和 system.demo.version 這兩個屬性,
接著,我們就能在組態檔中寫這兩個我們自定義的配置項了:
server:
port: 4790
# 自定義的配置
system:
demo:
name: 超級系統
version: 1.0
寫完這里的配置項,并不需要使用 @Value 去讀取,因為使用了 @ConfigurationProperties 注解,Spring 已經幫我們搞定了配置的值的讀取,至于它的實作原理,這里先不深究,
進行測驗,依然通過寫一個介面來測驗我們通過:
@RequestMapping("/demo")
@RestController
public class DemoController {
@Autowired
private SystemCustomConfig systemCustomConfig;
@GetMapping("/getSystemVersion")
public ResponseEntity<String> getSystemVersion() {
return ResponseEntity.ok(systemCustomConfig.getName() + "版本:" + systemCustomConfig.getVersion());
}
}
訪問該介面:localhost:4790/demo/getSystemVersion

關于自動提示
不過,目前有個問題就是,我們自己寫了個 Java Bean 后,在組態檔中寫配置項的時候并沒有相關提示,這個就比較不友好,如果當我們自己寫的配置想要給其他人用的話,別人都不知道有什么配置可以配,所以想要能像 Spring Boot 提供的配置提示一樣的話,就需要引入下面的依賴:
<!-- 組態檔處理器,組態檔進行系結就會有提示 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
spring-boot-configuration-processor是一個用于生成配置元資料的注解處理器,它會掃描使用@ConfigurationProperties注解的類和方法,來獲取配置引數并生成配置元資料,生成的配置元資料可以用于 IDE 的自動補全和提示功能,

如果你引入了這個依賴并且重啟該 Spring Boot 專案后,依舊沒有提示的話,嘗試開啟 IDEA 中的 annotaion processing,

關于 Cannot resolve configuration property
對于我們自定義的配置,會出現這樣的提示:Cannot resolve configuration property(無法處理自定義的配置屬性),如下:

解決方式就是定義一下元資料,用元資料來描述這個屬性,當我們移動到這個配置項上時,出現提示,我們直接點擊 Define configuration key xxx 就可以幫我們生成一個關于配置的元資料檔案,
additional-spring-configuration-metadata.json:
{
"properties": [
{
"name": "demo.author",
"type": "java.lang.String",
"description": "Demo的作者"
},
{
"name": "demo.description",
"type": "java.lang.String",
"description": "Demo的描述"
}
]
}
此時,還是一樣,重啟專案,如果黃色提示還是沒有去除的話,這里建議重新用 Maven 進行一次 clean,接著重新編譯整個專案,就可以了,于此同時,也具有了自動提示功能,

自定義組態檔
上面說的是自定義的配置,現在這里說自定義的組態檔,我們知道 Spring Boot 默認提供 application.properties 這個組態檔,那現在我們想自己寫一個組態檔,并且能在應用中讀取這個組態檔的資訊,該如何做呢?這里就涉及到 @PropertySource 這個注解了,
自定義的組態檔:
custom.yml:
# 自定義的組態檔
version: 2.0
description: 求關注!
讀取該組態檔的配置類:
@Data
@Configuration
@PropertySource("classpath:custom.yml")
public class DemoPropertiesSourceConfig {
@Value("${version}")
private String version;
@Value("${description}")
private String description;
}
這樣,就能讀取到自己撰寫的組態檔的配置資訊了,
如果有多個自定義的組態檔,那么可以使用 @PropertySources 注解,可以看到最后面多加了一個 s ,說明這個單詞是復數,通俗易懂,
@Configuration
@PropertySources({
@PropertySource("classpath:custom1.yml"),
@PropertySource("classpath:custom2.properties")
})
public class MyConfig {
// ...
}
總結
-
組態檔的兩種寫法:properties 和 yml
-
專案中存在多個組態檔,可以使用
spring.profiles.active屬性來切換使用哪個組態檔, -
自定義的一些配置屬性(配置項),如何讀取呢?可以在程式中通過
@Value或者@ConfigurationProperties來讀取, -
自定義的組態檔,可以通過
@PropertySource來指定獲取該自定義組態檔的資訊,
最后的最后
希望各位螢屏前的靚仔靚女們給個三連!你輕輕地點了個贊,那將在我的心里世界增添一顆明亮而耀眼的星!
咱們下期再見!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552422.html
標籤:其他
上一篇:<Python全景系列-1> Hello World,1分鐘配置好你的python環境
下一篇:返回列表
