詳解SpringBoot讀取配置文件的N種方法
我們在項目開發中經常會用到配置信息,例如數據庫連接的帳號、密碼等,而為瞭方便維護,我們通常將這些信息放到配置文件中。在需要用到這些配置信息時,可以通過代碼獲取。下面我們看看Spring中有哪些獲取配置信息的方法。
PropertiesLoaderUtils讀取
通過ClassPathResource加載配置文件資源,結合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 註解通過 ${key}獲取配置文件中和 key 對應的 value 值,並將value值賦給對應的變量,之後就像使用正常變量一樣就可以獲取到配置信息。
@ConfigurationProperties讀取一組配置信息
@ConfigurationProperties註解用於讀取指定前綴的一組配置信息並與bean綁定,具體的配置屬性會綁定到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適用與少量配置信息的場景,在一些較復雜的場景下(業務繁瑣、配置項多),需要考慮把相關一組配置信息封裝成一個或多個配置信息類,這時就可以使用@ConfigurationProperties。
@PropertySource讀取指定配置文件
當我們項目比較大配置信息比較多的時,如果所有的配置信息都放在一個配置文件中,就會顯得比較臃腫且不易理解和維護。此時,我們可以按照需求將該配置文件拆分為多個,並使用@PropertySource註解配合@Value或@ConfigurationProperties讀取指定配置文件中的配置信息。假設我們存儲數據連接信息的配置文件為jdbc.properties,內容如下:
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); }
指定項目的配置文件
在實際開發中,我們一般最少會有兩個環境——開發環境和線上環境,可能還會存在測試環境,這些環境往往會使用不同的配置信息,比如端口、數據庫鏈接地址等。如果我們把項目部署到線上環境後,在把配置信息一項一項的改成線上環境對應的會比較麻煩。比較科學的解決方法是,線上環境對應一套配置信息,開發環境對應一套,當我們在開發環境時指定讀取開發的配置,在線上時指定讀取線上的配置。
假設開發環境對應的配置文件為application-d.yml,線上環境對應的配置文件為application-d.yml。然後在application.yml文件中配置要使用的哪個配置文件即可,如在線上環境可按如下指定。
spring: profiles: active: - p
讀取復雜配置信息
看下如下配置文件
#http協議下消息傳輸 msgtransfer.tranprocol.http.orderid = order1 msgtransfer.tranprocol.http.count = 100 #fix協議下消息傳輸 msgtransfer.tranprocol.fix.orderid = order2 msgtransfer.tranprocol.fix.count = 200
上面的配置文件是為瞭支持不同協議的消息傳輸,該配置的key中也存在變量,這樣的配置信息如何讀取呢?
@Component @Data @ConfigurationProperties(prefix = "msgtransfer") public class MsgTransferCfg { private Map<String, MsgInfo> tranprocol; public static class MsgInfo { private String orderid; private int count; } }
關鍵點在private Map<String, MsgInfo> tranprocol;,http和fix會自動映射為tranprocol的key,orderid和count會映射到MsgInfo的成員屬性上。
如果在配置文件的key中使用變量的,需要在相應的bean中定義map,配置文件和map的對應規則如下:
前綴.map名稱.key.pro = value
到此這篇關於詳解SpringBoot讀取配置文件的N種方法的文章就介紹到這瞭,更多相關SpringBoot讀取配置文件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- @PropertySource 無法讀取配置文件的屬性值解決方案
- SpringBoot配置加載,各配置文件優先級對比方式
- Spring使用@Value註解與@PropertySource註解加載配置文件操作
- SpringBoot 配置文件給實體註入值方式
- Spring純註解開發模式讓開發簡化更簡化