springBoot中的properties配置解析
SpringBoot中免除了大部分手動配置,但是對于一些特定的情況,還是需要我們進行手動配置的,SpringBoot為我們提供了application.properties配置文件,讓我們可以進行自定義配置,來對默認(rèn)的配置進行修改,以適應(yīng)具體的生產(chǎn)情況,當(dāng)然還包括一些第三方的配置。
幾乎所有配置都可以寫到application.peroperties文件中,這個文件會被SpringBoot自動加載,免去了我們手動加載的煩惱。
但實際上,很多時候我們卻會自定義配置文件,這些文件就需要我們進行手動加載,SpringBoot是不會自動識別這些文件的,下面就來仔細(xì)看看這些方面的內(nèi)容。
1、配置文件的格式
SpringBoot可以識別兩種格式的配置文件,分別是yml文件與properties文件,我們可以將application.properties文件換成application.yml,這兩個文件都可以被SpringBoot自動識別并加載,但是如果是自定義的配置文件,就最好還是使用properties格式的文件,因為SpringBoot中暫時還并未提供手動加載yml格式文件的功能(這里指注解方式)。
application.properties配置文件欲被SpringBoot自動加載,需要放置到指定的位置:src/main/resource目錄下,一般自定義的配置文件也位于此目錄之下。
2、配置文件的加載
加載的意思就是將文件讀取到Spring容器之中,更確切的說就是將各個配置項裝載到Spring上下文容器之中供隨時取用。
application.properties配置文件是在SpringBoot項目啟動的時候被自動加載的,其內(nèi)部的相關(guān)設(shè)置會自動覆蓋SpringBoot默認(rèn)的對應(yīng)設(shè)置項,所以的配置項均會保存到Spring容器之中。
1-公共配置文件:application.properties
donghao.name=唯一浩哥 donghao.sex=男 donghao.age=80
自定義的xxx.properties配置文件是不會被SpringBoot自動加載的,需要手動去進行加載,這里的手動加載一般指的是注解的方式加載,這里就涉及到我們今天的重點之一:加載自定義屬性文件的注解:@PropertySource("classpath:xxx.properties"),這個注解專門用來加載指定位置的properties文件,Spring暫未提供加載指定位置yml文件的注解,所以才有之前的說法。
2-自定義配置文件:donghao.properties
donghao1.name=動畫 donghao1.sex=女 donghao1.age=22
其實無論對于哪里的properties文件,當(dāng)我們需要使用其中配置內(nèi)容的時候,就在當(dāng)前類的頂部加注該注解,將該配置文件加載到內(nèi)存,這些配置文件一次加載即可多次使用。
但更通用的情況是新建一個配置類,使用@Configuration標(biāo)注,再加上之前的@PropertySource("classpath:xxx.properties")注解,而類的內(nèi)部并不需要任何內(nèi)容,這是一個純粹的配置加載類。
由于@Configuration的作用(底層為@Component),他會被Spring的掃描器掃到,并加載到JVM,并創(chuàng)建Bean,而創(chuàng)建的時候就會執(zhí)行配置文件中配置項的加載。
這種方式加載的配置可以在任何Spring管轄的類中用@Value("${key}")的方式使用,見下方介紹。
3、配置項的使用
配置項的使用其實很簡單,只要是加載到Spring容器中的配置項都可以直接使用@Value("${key}")的方式來引用,一般將其配置在字段頂部,表示將配置項的值賦值給該字段。
當(dāng)然更多的情況是將這些配置項與一個JavaBean綁定起來使用,這樣綁定一次,我們就可以隨時使用。這里涉及到兩種情況,一種是將application.properties中的配置與JavaBean綁定,一種是將自定義配置文件中的配置與Javabean綁定。
第一種:applicaiton.properties屬性綁定JavaBean
這種情況相對簡單(因為application.properties文件會被自動加載,也就是說配置項會被自動加載到內(nèi)存,到Spring容器之中,省去了手動加載的配置),然后我們在要與屬性綁定的JavaBean的類定義頂部加@Component注解和@ConfigurationProperties(prefix="key")注解,
前者的目的是為了這個JavaBean可以被SpringBoot項目啟動時候被掃描到并加載到Spring容器之中,重點是后者,這個注解一般不是單獨使用的,他一般與后面要說的@EnableConfigurationProperties(JavaBean.class)配合使用,但是二者并非使用在同一位置,@ConfigurationProperties(prefix="key")注解加注在JavaBean類定義之上,按字面可以理解為屬性配置注解,更直接點的說法就是屬性綁定注解,
官方解釋是:如果想要綁定或者驗證一些來源自.properties文件中的額外屬性時,你可以在一個標(biāo)注的@Configuration的類的注有@Bean注解的方法或者一個類之上加注這個注解。
我們完全可以將其理解為綁定專用注解。它的作用就是將指定的前綴的配置項的值與JavaBean的字段綁定,這里要注意,為了綁定的成功,一般將字段的名稱與配置項鍵的最后一個鍵名相同,這樣整個鍵在去掉前綴的情況下就和字段名稱一致,以此來進行綁定。
第二種:自定義配置的屬性綁定JavaBean
這種情況與之前的基本相同,只是不能自動加載,需要手動加載,在JavaBean之上加上之前介紹的@PropertySource注解進行配置文件加載。還有一點就是將@Component改為@Configuration,為什么這么做呢?
@Configuration注解的底層就是@Component,但是二者意義不同,@Configuration注解側(cè)重配置之意,@Component側(cè)重組件之意,當(dāng)然配置也是項目組件之一,在這里我們要將配置文件屬性與JavaBean綁定,當(dāng)然更側(cè)重配置之意。
將配置與JavaBean綁定之后,我們就可以通過JavaBean來獲取配置的內(nèi)容,而且JavaBean已經(jīng)被@Component注解或者@Configuration注解加載到Spring容器,我們可以使用自動注入的方式在其他類中隨便使用。
這里要注意一點:當(dāng)我們在某個類中要使用這個JavaBean時,需要在這個類中指定這個JavaBean的類型,這個指定也要使用注解來指定,正是之前介紹的@EnableConfigurationProperties注解,這個注解與@ConfigurationProperties注解配套使用。
官方給出的解釋:這個注解是對@ConfigurationProperties的有效支持。
標(biāo)注有@ConfigurationProperties注解的Beans可以被使用標(biāo)準(zhǔn)的方式注冊(使用@Bean注解),或者,為了方便起見,直接用使用@EnableConfigurationProperties指定注冊。意思是這個注解提供了一種方便直接的注冊Bean的方式。
3-綁定JavaBean:Donghao.java
package com.donghao.model;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:donghao.properties")
@ConfigurationProperties(prefix="donghao1")
public class Donghao {
private String name;
private String sex;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}4-定義控制器:DonghaoController
package com.donghao.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.donghao.model.Donghao;
@RestController
@RequestMapping("/donghao")
@EnableConfigurationProperties(Donghao.class)
public class DonghaoController {
@Autowired
Donghao donghao;
@Value("${donghao.name}")
private String name;
@Value("${donghao.sex}")
private String sex;
@Value("${donghao.age}")
private String age;
@RequestMapping("/hello")
public String hello(){
return "我的名字叫"+name+",我是"+sex+"生,今年"+age+"歲了!";
}
@RequestMapping("/ss")
public String ss(){
return donghao.getName()+donghao.getSex()+donghao.getAge();
}
}5-定義啟動入口類:DonghaoApplication.java
package com.donghao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DonghaoApplication {
public static void main(String[] args) {
SpringApplication.run(DonghaoApplication.class, args);
}
}啟動程序之后,瀏覽器訪問:http://localhost:8080/donghao/hello,結(jié)果為:

瀏覽器訪問:http://localhost:8080/donghao/ss

我這里要重點強調(diào)一點,加載和使用并不相關(guān)聯(lián),雖然加載的目的是為了使用,但是加載和使用之間并不是強關(guān)聯(lián)的,我們完全可以加載但不使用,所以我們應(yīng)該將加載的過程與使用的過程分開來分析,它們對應(yīng)于不同的注解,這些注解之間也不是強關(guān)聯(lián)的,他們各有各的用途,如果只是加載自定義配置文件,只要一個@PropertySource注解就完事,使用方面的注解不用去管,當(dāng)需要使用的時候,我們完全可以選擇多種使用的方式,直接使用的話我們就使用@Value注解進行直接賦值,這個注解就可以直接將被加載到Spring容器中(environment)的屬性配置的值賦值到指定的字段,當(dāng)然也可以使用綁定JavaBean的方式。
還有一點要注意,千萬不要在公共配置文件application.properties和自定義配置文件xxx.properties中配置相同的的配置項的不同值,因為公共配置文件的優(yōu)先權(quán)最高,會覆蓋掉自定義配置文件中的內(nèi)容,你可以這么理解,公共配置文件中的某個配置被在啟動時加載到Spring容器中,之后又在另外一個自定義配置文件中加載了同名的配置項,二者有不同的值,但是系統(tǒng)會檢查二者的優(yōu)先權(quán),誰高誰留,誰低誰走,最后自定義配置文件中的值無效。
補充:感謝朋友Vtria丶提出的問題,這里添加一點補充內(nèi)容
有些時候我們需要定義一些靜態(tài)的字段(變量),也想使用這種方式實現(xiàn)值的注入,但是發(fā)現(xiàn)注入不進去,原因何在呢?這需要對值注入的原理有些了解,值的注入和屬性的注入類似,都是基于set方法實現(xiàn)的,那么就簡單了,我們只要針對靜態(tài)變量添加set方法即可,但是添加之后發(fā)現(xiàn)還是不好使,因為我們還需要將Value注解轉(zhuǎn)移到set方法上來,這樣就可以實現(xiàn)注入了。set方法的寫法可以與普通變量的寫法相同,用this調(diào)用,也可以直接類名點用。
比如:我們在applicaiton.properties中添加:
huahua=123321
然后在DonghaoController中添加如下代碼:
private static String huahua;
@Value("${huahua}")
public void setHuahua(String huahua){
// this.huahua = huahua;
DonghaoController.huahua = huahua;
}
@RequestMapping("/hh")
public String hh(){
return "新的測試"+ huahua;
}上面的兩種寫法均可實現(xiàn)目標(biāo)。
如此施為,即可實現(xiàn)靜態(tài)變量的值注入。
瀏覽器訪問:http://localhost:8080/donghao/hh

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題
項目中經(jīng)常會出現(xiàn)重復(fù)提交的問題,本文主要介紹了SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題,具有一定的參考價值,感興趣的可以了解一下2024-03-03
dubbo集成zipkin獲取Traceid的實現(xiàn)
這篇文章主要介紹了dubbo集成zipkin獲取Traceid的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
idea企業(yè)開發(fā)之新建各類型項目的詳細(xì)教程
這篇文章主要介紹了idea企業(yè)開發(fā)之新建各類型項目的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Java中json使用方法_動力節(jié)點Java學(xué)院整理
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式, json是個非常重要的數(shù)據(jù)結(jié)構(gòu),在web開發(fā)中應(yīng)用十分廣泛。下面通過本文給大家講解Java中json使用方法,感興趣的朋友一起看看吧2017-07-07
SpringBoot面試突擊之過濾器和攔截器區(qū)別詳解
過濾器(Filter)和攔截器(Interceptor)都是基于?AOP(Aspect?Oriented?Programming,面向切面編程)思想實現(xiàn)的,用來解決項目中某一類問題的兩種“工具”,但二者有著明顯的差距,接下來我們一起來看2022-10-10
IntelliJ IDEA創(chuàng)建maven多模塊項目(圖文教程)
這篇文章主要介紹了IntelliJ IDEA創(chuàng)建maven多模塊項目(圖文教程),非常具有實用價值,需要的朋友可以參考下2017-09-09

