properties
\(SprintBoot\)對於傳統\(Spring\)的一個很大的優點就在於比較方便的配置文件,在這里總結一下。
在\(boot\)中可以有\(3\)種配置文件。
最常見的就是\(application.properties\)文件,也是書寫常見的鍵值對形式,也是我一直以來都比較喜歡的一種配置文件形式,當時覺得\(yml\)的格式太丑了,而且可能縮進看上去不太舒服。
在\(application.properties\)中書寫\(key-value\)形式的配置形式,配置也一般以前綴形式出現,如果不太記得,也可以去\(spring\)的官網查看,比如服務器\(tomcat\)的配置一般以\(server\)開頭,日志配置以\(logging\)開頭等。
同時,\(boot\)也配置了大量默認值,很多值也在引入的\(starter\)中配置好了。
另外,\(boot\)提供了另外的兩種格式,\(yml\)和\(yaml\)格式。
如果\(boot\)中三種配置文件都配置了,優先級而言\(properties \gt yml \gt yaml\),不同配置文件中相同配置按照優先級相互覆蓋,不同文件的不同配置則全部保留。
yaml
\(yaml\)是一種新的數據序列化形式,有許多優點,容易閱讀,並且容易和腳本語言交互,以數據為中心,重數據輕格式。有兩種拓展名,\(yml\)和\(yaml\)都是正確的拓展名,但是一般來說前者更加主流。
規則:
- 大小寫敏感;
- 屬性的層級關系使用多行來描述,每行結尾使用冒號結束;
- 使用縮進代表層級關系,同層次左側對齊,只允許使用空格,不能使用\(tab\);
- 屬性值前面要有一個空格,名和值之間使用冒號+空格進行分割;
-
代表注釋;
核心規則:數據前面要有空格
字面值表示方式:
boolean: TRUE #TRUE,true,True,False,false,FALSE均可
float: 3.14 #6.8523015e+5支持科學計數法
int: 123 #0b1010_0110_1010_1110 支持二進制、八進制、十六進制
null: ~ #使用~表示null
string: HelloWorld #字符串可以直接書寫
string2: "HelloWorld" #可以用雙引號包裹特殊字符
date: 2021-12-25 #日期必須用yyyy-MM-dd格式
datetime: 2018-02-17T15:02:31+08:00 #日期與時間之間使用T連接,最后用+代表時區
數組表示形式:
在屬性名書寫位置下方使用減號作為數據的開始符號,每行書寫一個數據,減號與數據之間空格分隔
data:
- 1
- 2
- 3
subject:
- Java
- 前端
- 運維
- 測試
enterprise:
name: zhangsan
age: 20
subject:
- Java
- 計組
- 計網
likes: [吃飯,睡覺,打豆豆] #數組簡略形式
對象數據格式:
users
- name: Tom
age: 4
- name: Jack
age: 5
- name: zhangsan
age: 6
users1:
-
name: Tom
age: 33
-
name: Jack
age: 44
users2: [ {name:zhangsan, age:4}, {name:lisi, age:5}] #對象數組簡略形式
boot中讀配置
單一數據
使用\(@Value\)注解和\(SpEL\)表達式讀取配置的值如\(@Value(\$\{name\})\)即可讀取到默認配置文件中名為\(name\)的配置信息。
表示層級關系時,使用\(.\)即可,如\(@Value(\$\{user.name\})\)即可讀取到\(user.name\)這個配置的值。
讀取數組中的某一項時,\(@Value(\$\{likes[0]\})\)即可讀取到\(likes\)數組中的第\(1\)項。
變量引用
在\(yaml\)中可以設置變量的形式來減少同一前綴的配置項書寫。
如:
baseDir: C:\Windows
tempDir: ${baseDir}\temp
這樣就可以引用定義的\(baseDir\),更加方便的修改了。
mrbird
blog
name: mrbird's blog
title: Spring Boot
wholeTitle: ${mrbird.blog.name}--${mrbird.blog.title}
全部數據
讀取配置文件中的全部配置信息,\(boot\)提供了\(Environment\)對象進行配置信息的封裝,這其中封裝了配置文件中的全部信息。
可以使用\(getProperty\)方法獲取配置的值。
對象數據
對於一個完整的配置項來說,配置的\(SpEL\)表達式可能會很長,不方便記憶,所以可以使用配置的對象形式來加載配置信息。通常使用\(@ConfigurationProperties(prefix="xxx.yyy")\)來加載。
可以預先定義好對象用於封裝配置文件中的數據,由\(spring\)來加載數據到對象中。
創建的類要有\(getter\)和\(setter\)方法,且屬性名要對應上,且類要加入\(spring\)容器來管理,在配置類上加入\(@Component\)注解使其注入到容器中,或是在需要用到這個封裝類的地方使用\(@EnableConfigurationProperties\)來注入配置信息,該注解用於開啟對\(@ConfigurationProperties\)的支持。
@EnableConfigurationProperties
文檔中解釋:
當@EnableConfigurationProperties
注解應用到你的@Configuration
時, 任何被@ConfigurationProperties
注解的beans將自動被Environment屬性配置。 這種風格的配置特別適合與SpringApplication的外部YAML配置進行配合使用。
在類上方配置\(@ConfigurationProperties\)指定加載的數據,注解中值為配置的前綴\(prefix\)。
如下所示:
@Data
@ConfiguraionProperties(prefix = "datasource")
@Component
public class MyDataSource {
private String driver;
private String url;
private String username;
private String password;
}
更換配置來源
在\(boot\)中通常默認配置信息是從\(application.properties\)中讀取,但是對於有些信息,也可以配置在其他文件中,使用\(@PropertySource(path="classpath:xxx.properties")\)的方式執行配置來源后,再配置\(@ConfigurationProperties\)來指定前綴讀取配置信息。
常用注解
\(@PorpertySource\)
用於向容器中導入自定義配置信息,一般用於導入\(.properties\)的屬性配置文件,無法解析\(.yml\)文件。
\(@ImportResource\)
也用於向容器中導入\(Bean\)以及配置信息,一般用於導入\(.xml\)的屬性配置文件。在\(boot\)中用得比較少,已經被配置類所取代,如果要在\(boot\)中使用,要放在配置啟動類上。
\(@Configuration\)
用來標注該類是作為\(bean\)定義的源,相當於配置\(<beans>\)標簽。此外該注解標注的類允許通過調用同一類的其他\(@Bean\)標注的方法表示\(bean\)之間的依賴關系。
\(@Bean\)
標注在方法上,用於指示方法的返回值的實例化、配置和初始化都由IOC容器來管理。
比較通俗的解釋是\(@Configuration\)標注的類等同於一個\(xml\)文件,而\(@Bean\)標注的方法等同於一個\(<bean>\)標簽。
\(@ConfigurationProperties\)
將配置文件中以指定前綴的配置進行導入並綁定,作用與\(@Value\)類似,但是更加方便。
\(@EnableConfigurationProperties\)
使得配置了\(@ConfiguraionProperties\)的配置類生效,即引入該配置類,這樣前者的配置類可以不用交由IOC容器來管理。