詳解SpringBoot讀取配置文件的N種方法
我們?cè)陧?xiàng)目開(kāi)發(fā)中經(jīng)常會(huì)用到配置信息,例如數(shù)據(jù)庫(kù)連接的帳號(hào)、密碼等,而為了方便維護(hù),我們通常將這些信息放到配置文件中。在需要用到這些配置信息時(shí),可以通過(guò)代碼獲取。下面我們看看Spring中有哪些獲取配置信息的方法。
PropertiesLoaderUtils讀取
通過(guò)ClassPathResource加載配置文件資源,結(jié)合PropertiesLoaderUtils類讀取,源碼如下:
ClassPathResource resource = new ClassPathResource("application.properties");
try {
Properties properties = PropertiesLoaderUtils.loadProperties(resource); String account = properties.getProperty("jdbc.account");
} catch (IOException e) {
……
}
@Value注解讀取指定屬性
配置信息
jdbc: account: zhangsan pwd: 123456
讀取方法
@Component
public class JdbcService {
@Value("${jdbc.account}")
private String account;
@Value("${jdbc.pwd}")
private String pwd;
public void connectDb() {
System.out.println("Database has connected, jdbc account is "
+ account + ", password is " + pwd);
}
}
@Value 注解通過(guò) ${key}獲取配置文件中和 key 對(duì)應(yīng)的 value 值,并將value值賦給對(duì)應(yīng)的變量,之后就像使用正常變量一樣就可以獲取到配置信息。
@ConfigurationProperties讀取一組配置信息
@ConfigurationProperties注解用于讀取指定前綴的一組配置信息并與bean綁定,具體的配置屬性會(huì)綁定到bean的成員屬性中,即前綴名+成員屬性名等于配置文件中的key。之后可以像使用其他bean一樣使用該bean并讀取配置信息。
配置信息
user: name: zhangsan sex: 男 homeUrl: www.xxx.com
綁定bean
@Component
@Data
@ConfigurationProperties(prefix = "user")
public class User {
private String name;
private String sex;
private String homeUrl;
}
使用bean
@Service
public class UserService {
@Autowired
User user;
public void getUserInfo() {
System.out.println(user.toString());
}
}
@Value適用與少量配置信息的場(chǎng)景,在一些較復(fù)雜的場(chǎng)景下(業(yè)務(wù)繁瑣、配置項(xiàng)多),需要考慮把相關(guān)一組配置信息封裝成一個(gè)或多個(gè)配置信息類,這時(shí)就可以使用@ConfigurationProperties。
@PropertySource讀取指定配置文件
當(dāng)我們項(xiàng)目比較大配置信息比較多的時(shí),如果所有的配置信息都放在一個(gè)配置文件中,就會(huì)顯得比較臃腫且不易理解和維護(hù)。此時(shí),我們可以按照需求將該配置文件拆分為多個(gè),并使用@PropertySource注解配合@Value或@ConfigurationProperties讀取指定配置文件中的配置信息。假設(shè)我們存儲(chǔ)數(shù)據(jù)連接信息的配置文件為jdbc.properties,內(nèi)容如下:
jdbc: account: zhangsan pwd: 123456
@Component
@Data
@PropertySource(value = {"classpath:jdbc.properties"})
@ConfigurationProperties(prefix = "jdbc")
public class JdbcCfg {
private String account;
private String pwd;
public void connectDb() {
System.out.println("Database has connected, jdbc account is "
+ account + ", password is " + pwd);
}
}
也可以和@Value配合使用。
@Component
@PropertySource(value = {"classpath:jdbc.properties"})
public class JdbcCfg {
@Value("${jdbc.account}")
private String account;
@Value("${jdbc.pwd}")
private String pwd;
public void connectDb() {
System.out.println("Database has connected, jdbc account is "
+ account + ", password is " + pwd);
}
指定項(xiàng)目的配置文件
在實(shí)際開(kāi)發(fā)中,我們一般最少會(huì)有兩個(gè)環(huán)境——開(kāi)發(fā)環(huán)境和線上環(huán)境,可能還會(huì)存在測(cè)試環(huán)境,這些環(huán)境往往會(huì)使用不同的配置信息,比如端口、數(shù)據(jù)庫(kù)鏈接地址等。如果我們把項(xiàng)目部署到線上環(huán)境后,在把配置信息一項(xiàng)一項(xiàng)的改成線上環(huán)境對(duì)應(yīng)的會(huì)比較麻煩。比較科學(xué)的解決方法是,線上環(huán)境對(duì)應(yīng)一套配置信息,開(kāi)發(fā)環(huán)境對(duì)應(yīng)一套,當(dāng)我們?cè)陂_(kāi)發(fā)環(huán)境時(shí)指定讀取開(kāi)發(fā)的配置,在線上時(shí)指定讀取線上的配置。
假設(shè)開(kāi)發(fā)環(huán)境對(duì)應(yīng)的配置文件為application-d.yml,線上環(huán)境對(duì)應(yīng)的配置文件為application-d.yml。然后在application.yml文件中配置要使用的哪個(gè)配置文件即可,如在線上環(huán)境可按如下指定。
spring: profiles: active: - p
讀取復(fù)雜配置信息
看下如下配置文件
#http協(xié)議下消息傳輸 msgtransfer.tranprocol.http.orderid = order1 msgtransfer.tranprocol.http.count = 100 #fix協(xié)議下消息傳輸 msgtransfer.tranprocol.fix.orderid = order2 msgtransfer.tranprocol.fix.count = 200
上面的配置文件是為了支持不同協(xié)議的消息傳輸,該配置的key中也存在變量,這樣的配置信息如何讀取呢?
@Component
@Data
@ConfigurationProperties(prefix = "msgtransfer")
public class MsgTransferCfg {
private Map<String, MsgInfo> tranprocol;
public static class MsgInfo {
private String orderid;
private int count;
}
}
關(guān)鍵點(diǎn)在private Map<String, MsgInfo> tranprocol;,http和fix會(huì)自動(dòng)映射為tranprocol的key,orderid和count會(huì)映射到MsgInfo的成員屬性上。
如果在配置文件的key中使用變量的,需要在相應(yīng)的bean中定義map,配置文件和map的對(duì)應(yīng)規(guī)則如下:
前綴.map名稱.key.pro = value
到此這篇關(guān)于詳解SpringBoot讀取配置文件的N種方法的文章就介紹到這了,更多相關(guān)SpringBoot讀取配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA中實(shí)體類(POJO)與JSON快速互轉(zhuǎn)問(wèn)題
這篇文章主要介紹了IDEA中實(shí)體類(POJO)與JSON快速互轉(zhuǎn),本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
SpringBoot快速過(guò)濾出一次請(qǐng)求的所有日志的示例代碼
在現(xiàn)網(wǎng)出現(xiàn)故障時(shí),我們經(jīng)常需要獲取一次請(qǐng)求流程里的所有日志進(jìn)行定位,本文給大家介紹了SpringBoot如何快速過(guò)濾出一次請(qǐng)求的所有日志,文中有相關(guān)的代碼和示例供大家參考,需要的朋友可以參考下2024-03-03
Java實(shí)現(xiàn)Map遍歷key-value的四種方法
本文主要介紹了Java實(shí)現(xiàn)Map遍歷key-value的四種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Springboot集成Springbrick實(shí)現(xiàn)動(dòng)態(tài)插件的步驟詳解
這篇文章主要介紹了Springboot集成Springbrick實(shí)現(xiàn)動(dòng)態(tài)插件的詳細(xì)過(guò)程,文中的流程通過(guò)代碼示例介紹的非常詳細(xì),感興趣的同學(xué)可以參考一下2023-06-06
java微信掃碼支付模式一線下支付功能實(shí)現(xiàn)
本篇文章主要介紹了JAVA微信掃碼支付模式一線下支付功能實(shí)現(xiàn),具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11

