SpringBoot配置檔案application
配置檔案
SpringBoot使用一個全域性的配置檔案 , 配置檔名稱是固定的,有兩種檔案格式:
application.properties
語法結構 :key=value
application.yml
語法結構 :key:空格 value
配置檔案的作用 :其實SpringBoot在底層都給我們自動配置好了,但實際開發中有些情況自定義配置,所以該配置檔案的作用就是修改替換SpringBoot自動配置的預設值;
yaml概述
YAML是 "YAML Ain't a Markup Language" (YAML不是一種標記語言)的遞迴縮寫。在開發的這種語言時,YAML 的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)
這種語言以資料作為中心,而不是以標記語言為重點!
以前的配置檔案,大多數都是使用xml來配置;比如一個簡單的埠配置,我們來對比下yaml和xml
傳統xml配置:
<server> <port>8081<port> </server>
yaml配置:
server:
prot: 8080
yaml基礎語法
說明:語法要求嚴格!
1、空格不能省略
2、以縮排來控制層級關係,只要是左邊對齊的一列資料都是同一個層級的。
3、屬性和值的大小寫都是十分敏感的。
字面量:普通的值 [ 數字,布林值,字串 ]
字面量直接寫在後面就可以 , 字串預設不用加上雙引號或者單引號;
k: v
注意:
-
“ ” 雙引號,不會轉義字串裡面的特殊字元 , 特殊字元會作為本身想表示的意思;
比如 :name: "zhou \n jielun" 輸出 :zhou 換行 jielun
-
'' 單引號,會轉義特殊字元 , 特殊字元最終會變成和普通字元一樣輸出
比如 :name: ‘zhou\n jielun’ 輸出 :zhou\n jielun
物件、Map(鍵值對)
#物件、Map格式 k: v1: v2: #例如: student: name: zhoujielun age: 30 #行內寫法 student: {name: qinjiang,age:3}
陣列( List、set )
用 - 值表示陣列中的一個元素,比如
pets: - cat - dog - pig #行內寫法 pets: [cat,dog,pig]
yaml檔案更強大的地方在於,他可以給我們的實體類直接注入匹配值!
yaml注入配置檔案
1、在springboot專案中的resources目錄下新建一個檔案 application.yml,配置一個物件
person: name: jielun age: 30 happy: false birth: 2000/01/01 maps: {k1: v1,k2: v2} lists: - code - girl - music dog: name: 狗狗 age: 1
2、編寫一個實體類Person;
@Component //註冊bean到容器中 public class Person { private String name; private Integer age; private Boolean happy; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; //有參無參構造、get、set方法、toString()方法 }
在實體類配置:@ConfigurationProperties(prefix = "person")
此時,IDEA 提示,springboot配置註解處理器沒有找到,讓我們看文件,我們可以檢視文件,找到一個依賴!
得知需要新增一個依賴:
<!-- 匯入配置檔案處理器,配置檔案進行繫結就會有提示,需要重啟 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
在測試類測試列印配置注入結果:
@Autowired Person person; //將person自動注入進來 @Test public void contextLoads() { System.out.println(person); //列印person資訊 }
列印:
載入指定的配置檔案
@configurationProperties:是預設從全域性配置檔案中獲取值的,很多場景是需要從指定配置檔案載入的,這時候需要:
@PropertySource :載入指定的配置檔案 +@Value來具體注入
例如:
新建一個person.properties配置檔案,檔案內容name=jielun
然後在我們的程式碼中指定載入person.properties檔案
@PropertySource(value = "classpath:person.properties") @Component //註冊bean public class Person { @Value("${name}") private String name; ...... }
yaml非常強大,還可以有下面的操作:
配置檔案佔位符
例如編寫佔位符生成uuid、隨機數
測試結果:
到這裡,就有兩種方式了,對比如下:
1、@ConfigurationProperties只需要寫一次即可 , @Value則需要每個欄位都新增
2、鬆散繫結:比如我的yml中寫的last-name,這個和lastName是一樣的, - 後面跟著的字母預設是大寫的。這就是鬆散繫結。可以測試一下
3、JSR303資料校驗 , 這個就是我們可以在欄位是增加一層過濾器驗證 , 可以保證資料的合法性
4、複雜型別封裝,yml中可以封裝物件 , 使用value就不支援
結論:
配置yml和配置properties都可以獲取到值 , 強烈推薦 yml;
如果我們在某個業務中,只需要獲取配置檔案中的某個值,可以使用一下 @value;
如果說,我們專門編寫了一個JavaBean來和配置檔案進行一一對映,就直接@configurationProperties,不要猶豫!