原創做品,能夠轉載,可是請標註出處地址:http://www.cnblogs.com/V1haoge/p/7183408.htmlhtml
SpringBoot中免除了大部分手動配置,可是對於一些特定的狀況,仍是須要咱們進行手動配置的,SpringBoot爲咱們提供了application.properties配置文件,讓咱們能夠進行自定義配置,來對默認的配置進行修改,以適應具體的生產狀況,固然還包括一些第三方的配置。幾乎全部配置均可以寫到application.peroperties文件中,這個文件會被SpringBoot自動加載,免去了咱們手動加載的煩惱。但實際上,不少時候咱們卻會自定義配置文件,這些文件就須要咱們進行手動加載,SpringBoot是不會自動識別這些文件的,下面就來仔細看看這些方面的內容。java
一、配置文件的格式web
SpringBoot能夠識別兩種格式的配置文件,分別是yml文件與properties文件,咱們能夠將application.properties文件換成application.yml,這兩個文件均可以被SpringBoot自動識別並加載,可是若是是自定義的配置文件,就最好仍是使用properties格式的文件,由於SpringBoot中暫時還並未提供手動加載yml格式文件的功能(這裏指註解方式)。spring
application.properties配置文件欲被SpringBoot自動加載,須要放置到指定的位置:src/main/resource目錄下,通常自定義的配置文件也位於此目錄之下。瀏覽器
二、配置文件的加載app
加載的意思就是將文件讀取到Spring容器之中,更確切的說就是將各個配置項裝載到Spring上下文容器之中供隨時取用。測試
application.properties配置文件是在SpringBoot項目啓動的時候被自動加載的,其內部的相關設置會自動覆蓋SpringBoot默認的對應設置項,因此的配置項均會保存到Spring容器之中。動畫
1-公共配置文件:application.propertiesthis
1 donghao.name=惟一浩哥 2 donghao.sex=男 3 donghao.age=80
自定義的xxx.properties配置文件是不會被SpringBoot自動加載的,須要手動去進行加載,這裏的手動加載通常指的是註解的方式加載,這裏就涉及到咱們今天的重點之一:加載自定義屬性文件的註解:@PropertySource("classpath:xxx.properties"),這個註解專門用來加載指定位置的properties文件,Spring暫未提供加載指定位置yml文件的註解,因此纔有以前的說法。spa
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}")的方式使用,見下方介紹。
三、配置項的使用
配置項的使用其實很簡單,只要是加載到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
我這裏要重點強調一點,加載和使用並不相關聯,雖然加載的目的是爲了使用,可是加載和使用之間並非強關聯的,咱們徹底能夠加載但不使用,因此咱們應該將加載的過程與使用的過程分開來分析,它們對應於不一樣的註解,這些註解之間也不是強關聯的,他們各有各的用途,若是隻是加載自定義配置文件,只要一個@PropertySource註解就完事,使用方面的註解不用去管,當須要使用的時候,咱們徹底能夠選擇多種使用的方式,直接使用的話咱們就使用@Value註解進行直接賦值,這個註解就能夠直接將被加載到Spring容器中(environment)的屬性配置的值賦值到指定的字段,固然也可使用綁定JavaBean的方式。
還有一點要注意,千萬不要在公共配置文件application.properties和自定義配置文件xxx.properties中配置相同的的配置項的不一樣值,由於公共配置文件的優先權最高,會覆蓋掉自定義配置文件中的內容,你能夠這麼理解,公共配置文件中的某個配置被在啓動時加載到Spring容器中,以後又在另一個自定義配置文件中加載了同名的配置項,兩者有不一樣的值,可是系統會檢查兩者的優先權,誰高誰留,誰低誰走,最後自定義配置文件中的值無效。
補充:感謝朋友Vtria丶提出的問題,這裏添加一點補充內容
有些時候咱們須要定義一些靜態的字段(變量),也想使用這種方式實現值的注入,可是發現注入不進去,緣由何在呢?這須要對值注入的原理有些瞭解,值的注入和屬性的注入相似,都是基於set方法實現的,那麼就簡單了,咱們只要針對靜態變量添加set方法便可,可是添加以後發現仍是很差使,由於咱們還須要將Value註解轉移到set方法上來,這樣就能夠實現注入了。set方法的寫法能夠與普通變量的寫法相同,用this調用,也能夠直接類名點用。
好比:咱們在applicaiton.properties中添加:
1 huahua=123321
而後在DonghaoController中添加以下代碼:
1 private static String huahua; 2 3 @Value("${huahua}") 4 public void setHuahua(String huahua){ 5 // this.huahua = huahua; 6 DonghaoController.huahua = huahua; 7 } 8 9 @RequestMapping("/hh") 10 public String hh(){ 11 return "新的測試"+ huahua; 12 }
上面的兩種寫法都可實現目標。
如此施爲,便可實現靜態變量的值注入。
瀏覽器訪問:http://localhost:8080/donghao/hh