SpringBoot2.0學習筆記:(二) 配置文件的使用

1. 簡單介紹

在使用Spring Initializr快速創建好一個Spring Boot項目之後,可以看到在resource目錄下有一個application.properties文件,這是Spring Boot的全局配置文件。其名稱是固定的,或是application.properties或是application.yml。它的作用在於修改Spring Boot自動配置的默認值。

2. 配置文件屬性注入

####2.1 定義普通Java類

public class Animal {

    private String name;
    private int age;
    
    // 忽略getter-setter 與toString()
}
public class Person {

    private String name;
    private int age;
    private Date birthDay;
    private boolean boy;
    private Animal animal;
    private Map<String,Object> map;
    private List<String> list;
    
    // 忽略getter-setter 與toString()
}

這裏寫圖片描述

####2.2 定義配置文件內容:

application.properties:

person.name=張三
person.age=19
person.boy=false
person.birthDay=1995/12/11
person.map.key1=val1
person.map.key2=qw2
person.map.key3=22
person.list=aa,bb,cc
person.animal.name=dog
person.animal.age=4

2.3 屬性注入

我們可以使用@ConfigurationProperties 註解將配置文件中的某些屬性值映射到組件中,其作用就是通知SpringBoot將本類中的所有屬性和配置文件中相關的屬性進行綁定,@ConfigurationProperties還有一個屬性爲prefix,其爲配置文件中相關屬性的前綴。@ConfigurationProperties需結合@Component使用,因爲只有容器中的組件才能使用容器提供的@ConfigurationProperties功能。具體如下:

@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;
    private int age;
    private Date birthDay;
    private boolean boy;
    private Animal animal;
    private Map<String,Object> map;
    private List<String> list;
}

2.4 測試

在test目中,有一個自動生成的單元測試類,我們可以在裏面測試一下屬性是否真的成功注入了:


@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootHelloworldApplicationTests {

    @Autowired
    Person person;

	@Test
	public void contextLoads() {
	    System.out.println(person.toString());
	}

}

直接執行測試方法,可以看到控制檯輸出了:

Person{name='張三', age=19, birthDay=Mon Dec 11 00:00:00 CST 1995, boy=false, animal=Animal{name='dog', age=4}, map={key1=val1, key2=qw2, key3=22}, list=[aa, bb, cc]}

用IDE開發在這裏輸出中文的時候,可能遭遇亂碼,我們修改一下IDEA的設置:

這裏寫圖片描述

3. @PropertySource的使用

一個正式的項目肯定有很多的配置,將這些配置都放在同一個application.properties配置文件中,未免有些不合適,我們可以定義多個配置文件,將不同功能的配置分別放在不同的文件中。那麼我們該如何引入這些配置文件呢?畢竟Spring Boot默認只讀取application.properties這個全局配置文件。

@PropertySource,目的是就是用來加載指定的屬性文件。

我們先在resources資源文件夾下新建一個config文件夾,在裏面建一個person.properties文件,將application.properties中關於person的配置複製到person.properties文件中,最後清空application.properties。

這裏寫圖片描述

我們先跑一下剛纔的測試方法,得到下面的結果:

Person{name='null', age=0, birthDay=null, boy=false, animal=null, map=null, list=null}

可以看到沒有任何屬性被賦值。

現在用@PropertySource將person.properties加載進來

@Component
@ConfigurationProperties(prefix = "person")
@PropertySource({"classpath:config/person.properties"})
public class Person {

    private String name;
    private int age;
    private Date birthDay;
    private boolean boy;
    private Animal animal;
    private Map<String,Object> map;
    private List<String> list;
}

在執行測試方法看一下結果:

Person{name='張三', age=19, birthDay=Mon Dec 11 00:00:00 CST 1995, boy=false, animal=Animal{name='dog', age=4}, map={key3=22, key2=qw2, key1=val1}, list=[aa, bb, cc]}

可以看出配置文件被加載進來了。

4. 配置文件佔位符

在Spring Boot的配置文件中,我們可以使用Spring Boot提供的一些隨機數來作爲屬性的值,例如:

person.name=白丁_${random.uuid}
person.age=${random.int(30)}
person.boy=false
person.birthDay=1995/12/11
person.map.key1=${random.value}
person.map.key2=qw2
person.map.key3=22
person.list=aa,bb,cc
person.animal.name=${person.name}_cat
person.animal.age=4

看一下輸出了什麼:

Person{name='白丁_ea262a01-3237-489e-b81a-416dacce1fd2', age=16, birthDay=Mon Dec 11 00:00:00 CST 1995, boy=false, animal=Animal{name='白丁_d34d4872-e98c-4567-9ef8-1b6c454a08ef_cat', age=4}, map={key1=9e347bcbf5975aab1ac3f5741e8b89f1, key2=qw2, key3=22}, list=[aa, bb, cc]}

在配置文件中,隨機數可以有如下的寫法:

${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
${random.uuid}

佔位符還可以獲取之前的配置的值:

person.animal.name=${person.name}_cat

若是${person.name}沒有值的話,會直接輸出這個佔位符。但我們可以賦予它一個默認值:

person.animal.name=${person.name:白丁}_cat

當${person.name}獲取不到值的時候,person.animal.name的值就爲白丁_cat

5. 配置文件加載位置

Spring Boot啓動以後會掃描以下位置的application.properties或者application.yml作爲Spring Boot的默認配置文件。

  • file:./config

這裏寫圖片描述

  • file:./

這裏寫圖片描述

  • classpath:/config/

這裏寫圖片描述

  • classpath:/

這裏寫圖片描述

以上按照優先級從高到低的順序排列,所有位置的文件都會被加載,高優先級的配置內容會覆蓋低優先級內容,但這些配置文件也形成了互補配置。即這些配置文件中相同的配置低優先級會被高優先級覆蓋,但低優先級文件中不同的配置依然會被正常加載。

最後,我們還以通過spring.config.location來改變默認的配置文件位置

項目打包好以後,我們可以使用命令行參數的形式,啓動項目的時候來指定配置文件的新位置;指定配置文件和默 認加載的這些配置文件共同起作用形成互補配置 。

java -jar spring-boot-helloworld-0.0.1.jar --spring.config.location=D:/a
pplication.properties

6. 外部配置加載順序

SpringBoot也可以從以下位置加載配置; 優先級從高到低;高優先級的配置覆蓋低優先級的配置,所有的配置會 形成互補配置

  • 1:命令行參數

    Spring Boot所有的配置都可以在命令行上進行指定,多個配置可以用空格隔開

    java -jar spring-boot-helloworld-0.0.1.jar --spring.profiles.active=dev --server.port=8090

  • 2:Java系統屬性,如虛擬機參數

  • 3:由jar包外向jar包內進行尋找; 優先加載帶profile 的配置文件

    首先加載jar包外部(與jar包同級目錄)的application-{profile}.properties ,在加載jar包內部的application-{profile}.properties,之後加載jar外部的application.properties ,最後纔是加載jar包內部的application.properties

  • 4:@Configuration註解類上的@PropertySource

  • … …(官方文檔有17種配置加載方式,這裏只列舉集中常用的)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章