配置文件
作用:spring boot 自動配置(約定,8080 ).可以使用配置文件 對默認的配置 進行修改
application.properties的修改方式
yml修改方式
例子:
把默認端口8080修改為8888,訪問成功:
默認全局配置文件有兩種類型:
application.properties
操作:application.properties采用 :key=value 形式進行配置,無論是配置什么類型的數據,都是 k = v 形式配置,有時候給一個類的屬性賦值,這個屬性套了很多層,那么只有k變長一點,value不變,例: server.servlet.encoding.charset= UTF-8 ,server.servlet.encoding.charset這個是key , 后面的UTF-8是值。
application.yml
application.yml : yaml ain't myarkup language ,不是一個標記文檔
xml:是一個標記文檔,如下:
<server> <port>8882</port> <path>/a/b/c</path> </server>
yml語法
- key:空格value
- 通過垂直對齊 指定層次關系
- value默認可以不寫引號; ""會將其中的轉義符進行轉義(也就是說加了雙引號的value,里面如果包含\n換行會生效,而單引號/不加任何符號則直接輸出),其他不會
yml寫法有兩種形式,不過只有Java的八大基本數據類型是不區分 行內寫法/垂直對齊寫法
yml行內寫法
接下來用下面的例子展示yml不同數據類型的行內寫法
yml除了可以配置之外,還可以屬性綁定:
例:創建一個實體類對象,並且綁定屬性
@Component //把實體類加入ioc容器 @ConfigurationProperties(prefix = "student") //屬性綁定聲明 這里的student對應yml那邊的student public class Student { private String name; //字符串類型 private int age; //整型 private boolean sex; //布爾型 private Date birthday; //日期型 private Map<String,Object> location; //Map集合 private String[] hobbies; //字符串數組 private List<String> skills; // list集合 private Pet pet;//寵物 //對象類型 getter/setter方法省略,自己可以生成
toString省略 }
補充Pet類:
public class Pet { int age; String name; getter/setter省略
toString省略 }
然后在yml配置文件注入值,首先是使用行內寫法:
Student:
name: zs
age: 23
sex: true
#上面三個都是基本數據類型,不區分寫法,直接寫
#日期類型
birthday: 2019/02/12
#map集合
location: {province: 廣東,city: 廣州,zone: 增城區}
#數組和list\set集合 輸入格式一樣 ,中括號可以省略
hobbies: [足球,籃球]
#list集合
skills: [編程,金融]
#對象類型
pet: {name: wc11,strain: hsq}
總結:行內寫法,map集合和對象類型一樣形式是 {key:空格value , .. };數組和list/set集合都一樣是[a,b,c] 中括號還可以省略。
yml垂直對齊寫法
Student:
name: zs
age: 23
sex: true
#上面三個都是基本數據類型,不區分寫法,直接寫
#日期類型
birthday: 2019/02/12
#map集合
location:
province: 廣東
city: 廣州
zone: 增城區
#數組和list\set集合 輸入格式一樣
hobbies:
- 足球
- 籃球
#list集合
skills:
- 編程
- 金融
#對象類型
pet:
name: wc11
age: 12
垂直對齊形式,map集合和對象類型是同一寫法,格式如下:
map/對象類型
key:空格value
key:空格value
而數組和list/set集合也一樣,格式如下:
數組/list/set:
-空格xx
-空格xx
數據綁定后,在測試類里面裝配一個學生對象測試:
數據綁定成功,如上圖輸出了綁定的數據信息, yml里面配置的屬性確實打印出來的,測試成功。
注意:@Qualifier()注解要結合@Autowire()注解才生效,另外屬性綁定是通過yml的頭部的student和實體類聲明的@ConfigurationProperties(prefix = "student")名字對應才生效,忽略大小寫。
yml總結:
application.properties配置方式 : key=value
application.yml配置方式:
1. key:空格value 簡單屬性配置
2.通過垂直對齊 指定層次關系
3.value默認可以不寫引號; ""會將其中的轉義符進行轉義,其他不會
數據類型yml的兩種配置方式:
1、list/set/數組
1.1 行內寫法 hobbies: [足球,籃球] 中括號可省略
1.2 垂直方式 hobbies:
- 足球
- 籃球
2、對象/map
2.1 行內寫法 location :{province: 廣東,city: 廣州,zone: 增城區} 注意v前面有空格
2.2 垂直方式 location :
province: 廣東
city: 廣州 通過垂直對齊表示層次關系
屬性注入
上面我們舉的yml屬性注入例子,是通過@ConfigurationProperties()注解來實現綁定的,還有一個注解可以實現屬性綁定注入。
那就是 @Value("xx")注解,@Value注解可以直接寫到實體類的屬性上面,也可以通過springEL表達式,在配置文件中獲取注入的值。
例子:
上面的例子,我結合了兩個注解的使用,也就是@Value()和@ConfigurationProperties(),他們的屬性都已經綁定注入了,控制台也輸出了結果,可以發現是可以結合使用的,另外在yml沒設置name屬性是因為,會覆蓋@Value()的注入,配置文件的優先級高於@Value()注解。
補充:.properties和.yml文件同時配置一個相同屬性,.properties的會生效,因為優先級高。
@Value()和@ConfigurationProperties()區別
@configurationProperties | @Value | |
注值方式 | 批量注入 | 單個注入 |
松散語法 | 支持 | 不支持 |
SpringEL語法 | 不支持 | 支持 |
JSR303數據檢驗 | 支持 | 不支持 |
注入復雜類型 | 支持 | 不支持 |
1、松散語法:對類似的格式,限制不那么嚴格,比如:變量 userName = user_name = user-name ,這個三個在松散語法里面都是指同一個屬性。
在yml里面寫了 Student.user-name="zs" ,那邊的實體類名字雖然是userName,但是還是會被注入值。
2、SpringEL語法:格式 ${對象.變量名},注意只能在@Value注解中使用,因為只有@Value支持SpEL語法,如下
3、JSR303數據檢驗:例如我有一個屬性是Email,那么注冊的時候需要寫if語句/正則表達式判斷是否為郵箱類型,有了JSR303數據檢驗就可以用一個注解搞定,如下:

@Validated //開啟jsr303數據檢驗的注解 public class Student { @Email String email;
然后在yml文件那邊郵箱亂填一些數據,運行如下圖:
如果郵箱格式錯誤,就會拋出異常,另外我這個@Email注解使用的依賴如下:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version> </dependency>
注意,@Email注解使用依賴版本太高(例如:6.0.18版本)會無效,甚至運行不起來。
下面測試@Value()注解不支持JSR303數據檢驗:
還有一個復雜類型注入就不測試了,只有@configuration支持注入復雜數據類型,@Value注解不支持復雜類型注入,上面的表格可以自己測試一下。
@PropertySource
作用:指定配置文件被加載。
springboot默認會加載application.properties/application.yml文件中的數據,但是如果自己配置的屬性不在這兩個文件中呢,比如我在conf.properties中配置了屬性,那么就要使用@PropertySource注解在實體類加載conf.properties配置文件。
@PropertySource(value = "{classpath:conf.properties}") //聲明當前student實體類加載conf.properties配置文件 public class Student { ...
但是,@PropertySource注解只能加載.properties文件,不能加載.yml文件.
The end.