SpringBoot中免除了大部分手動配置,但是對于一些特定的情況,還是需要我們進行手動配置的,SpringBoot為我們提供了application.properties配置檔案,讓我們可以進行自定義配置,來對預設的配置進行修改,以适應具體的生産情況,當然還包括一些第三方的配置。幾乎所有配置都可以寫到application.peroperties檔案中,這個檔案會被SpringBoot自動加載,免去了我們手動加載的煩惱。但實際上,很多時候我們卻會自定義配置檔案,這些檔案就需要我們進行手動加載,SpringBoot是不會自動識别這些檔案的,下面就來仔細看看這些方面的内容。
1、配置檔案的格式
SpringBoot可以識别兩種格式的配置檔案,分别是yml檔案與properties檔案,我們可以将application.properties檔案換成application.yml,這兩個檔案都可以被SpringBoot自動識别并加載,但是如果是自定義的配置檔案,就最好還是使用properties格式的檔案,因為SpringBoot中暫時還并未提供手動加載yml格式檔案的功能(這裡指注解方式)。
application.properties配置檔案欲被SpringBoot自動加載,需要放置到指定的位置:src/main/resource目錄下,一般自定義的配置檔案也位于此目錄之下。
2、配置檔案的加載
加載的意思就是将檔案讀取到Spring容器之中,更确切的說就是将各個配置項裝載到Spring上下文容器之中供随時取用。
application.properties配置檔案是在SpringBoot項目啟動的時候被自動加載的,其内部的相關設定會自動覆寫SpringBoot預設的對應設定項,是以的配置項均會儲存到Spring容器之中。
1-公共配置檔案:application.properties
1 donghao.name=唯一浩哥
2 donghao.sex=男
3 donghao.age=80
自定義的xxx.properties配置檔案是不會被SpringBoot自動加載的,需要手動去進行加載,這裡的手動加載一般指的是注解的方式加載,這裡就涉及到我們今天的重點之一:加載自定義屬性檔案的注解:@PropertySource("classpath:xxx.properties"),這個注解專門用來加載指定位置的properties檔案,Spring暫未提供加載指定位置yml檔案的注解,是以才有之前的說法。
2-自定義配置檔案:donghao.properties
1 donghao1.name=動畫
2 donghao1.sex=女
3 donghao1.age=22
其實無論對于哪裡的properties檔案,當我們需要使用其中配置内容的時候,就在目前類的頂部加注該注解,将該配置檔案加載到記憶體,這些配置檔案一次加載即可多次使用。但更通用的情況是建立一個配置類,使用@Configuration标注,再加上之前的@PropertySource("classpath:xxx.properties")注解,而類的内部并不需要任何内容,這是一個純粹的配置加載類。由于@Configuration的作用(底層為@Component),他會被Spring的掃描器掃到,并加載到JVM,并建立Bean,而建立的時候就會執行配置檔案中配置項的加載。這種方式加載的配置可以在任何Spring管轄的類中用@Value("${key}")的方式使用,見下方介紹。
3、配置項的使用
配置項的使用其實很簡單,隻要是加載到Spring容器中的配置項都可以直接使用@Value("${key}")的方式來引用,一般将其配置在字段頂部,表示将配置項的值指派給該字段。

當然更多的情況是将這些配置項與一個JavaBean綁定起來使用,這樣綁定一次,我們就可以随時使用。這裡涉及到兩種情況,一種是将application.properties中的配置與JavaBean綁定,一種是将自定義配置檔案中的配置與Javabean綁定。
第一種:applicaiton.properties屬性綁定JavaBean
這種情況相對簡單(因為application.properties檔案會被自動加載,也就是說配置項會被自動加載到記憶體,到Spring容器之中,省去了手動加載的配置),然後我們在要與屬性綁定的JavaBean的類定義頂部加@Component注解和@ConfigurationProperties(prefix="key")注解,前者的目的是為了這個JavaBean可以被SpringBoot項目啟動時候被掃描到并加載到Spring容器之中,重點是後者,這個注解一般不是單獨使用的,他一般與後面要說的@EnableConfigurationProperties(JavaBean.class)配合使用,但是二者并非使用在同一位置,@ConfigurationProperties(prefix="key")注解加注在JavaBean類定義之上,按字面可以了解為屬性配置注解,更直接點的說法就是屬性綁定注解,官方解釋是:如果想要綁定或者驗證一些來源自.properties檔案中的額外屬性時,你可以在一個标注的@Configuration的類的注有@Bean注解的方法或者一個類之上加注這個注解。我們完全可以将其了解為綁定專用注解。它的作用就是将指定的字首的配置項的值與JavaBean的字段綁定,這裡要注意,為了綁定的成功,一般将字段的名稱與配置項鍵的最後一個鍵名相同,這樣整個鍵在去掉字首的情況下就和字段名稱一緻,以此來進行綁定。
第二種:自定義配置的屬性綁定JavaBean
這種情況與之前的基本相同,隻是不能自動加載,需要手動加載,在JavaBean之上加上之前介紹的@PropertySource注解進行配置檔案加載。還有一點就是将@Component改為@Configuration,為什麼這麼做呢?
@Configuration注解的底層就是@Component,但是二者意義不同,@Configuration注解側重配置之意,@Component側重元件之意,當然配置也是項目元件之一,在這裡我們要将配置檔案屬性與JavaBean綁定,當然更側重配置之意。
将配置與JavaBean綁定之後,我們就可以通過JavaBean來擷取配置的内容,而且JavaBean已經被@Component注解或者@Configuration注解加載到Spring容器,我們可以使用自動注入的方式在其他類中随便使用。
這裡要注意一點:當我們在某個類中要使用這個JavaBean時,需要在這個類中指定這個JavaBean的類型,這個指定也要使用注解來指定,正是之前介紹的@EnableConfigurationProperties注解,這個注解與@ConfigurationProperties注解配套使用。官方給出的解釋:這個注解是對@ConfigurationProperties的有效支援。标注有@ConfigurationProperties注解的Beans可以被使用标準的方式注冊(使用@Bean注解),或者,為了友善起見,直接用使用@EnableConfigurationProperties指定注冊。意思是這個注解提供了一種友善直接的注冊Bean的方式。
3-綁定JavaBean:Donghao.java
1 package com.donghao.model;
2
3 import org.springframework.boot.context.properties.ConfigurationProperties;
4 import org.springframework.context.annotation.Configuration;
5 import org.springframework.context.annotation.PropertySource;
6
7 @Configuration
8 @PropertySource("classpath:donghao.properties")
9 @ConfigurationProperties(prefix="donghao1")
10 public class Donghao {
11 private String name;
12 private String sex;
13 private String age;
14 public String getName() {
15 return name;
16 }
17 public void setName(String name) {
18 this.name = name;
19 }
20 public String getSex() {
21 return sex;
22 }
23 public void setSex(String sex) {
24 this.sex = sex;
25 }
26 public String getAge() {
27 return age;
28 }
29 public void setAge(String age) {
30 this.age = age;
31 }
32 }
4-定義控制器:DonghaoController
1 package com.donghao.controller;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.beans.factory.annotation.Value;
5 import org.springframework.boot.context.properties.EnableConfigurationProperties;
6 import org.springframework.web.bind.annotation.RequestMapping;
7 import org.springframework.web.bind.annotation.RestController;
8
9 import com.donghao.model.Donghao;
10
11 @RestController
12 @RequestMapping("/donghao")
13 @EnableConfigurationProperties(Donghao.class)
14 public class DonghaoController {
15
16 @Autowired
17 Donghao donghao;
18
19 @Value("${donghao.name}")
20 private String name;
21
22 @Value("${donghao.sex}")
23 private String sex;
24
25 @Value("${donghao.age}")
26 private String age;
27
28
29 @RequestMapping("/hello")
30 public String hello(){
31 return "我的名字叫"+name+",我是"+sex+"生,今年"+age+"歲了!";
32 }
33
34 @RequestMapping("/ss")
35 public String ss(){
36 return donghao.getName()+donghao.getSex()+donghao.getAge();
37 }
38 }
5-定義啟動入口類:DonghaoApplication.java
1 package com.donghao;
2
3 import org.springframework.boot.SpringApplication;
4 import org.springframework.boot.autoconfigure.SpringBootApplication;
5
6 @SpringBootApplication
7 public class DonghaoApplication {
8
9 public static void main(String[] args) {
10
11 SpringApplication.run(DonghaoApplication.class, args);
12
13 }
14
15 }
啟動程式之後,浏覽器通路:http://localhost:8080/donghao/hello,結果為:
浏覽器通路:http://localhost:8080/donghao/ss