SpringBoot-幾類配置文件詳解


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容器來管理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM