SpringBoot加載配置6種方式分析
引言
從配置文件中獲取屬性應(yīng)該是SpringBoot開發(fā)中最為常用的功能之一,但就是這么常用的功能,仍然有很多開發(fā)者抓狂~今天帶大家簡單回顧一下這六種的使用方式:
說明 | |
---|---|
Environment對(duì)象 | Environment 是 springboot 核心的環(huán)境配置接口,它提供了簡單的方法來訪問應(yīng)用程序?qū)傩裕ㄏ到y(tǒng)屬性、操作系統(tǒng)環(huán)境變量、命令行參數(shù)、和應(yīng)用程序配置文件中定義的屬性等等,使用 Environment 方式來獲取配置屬性值非常簡單,只要注入Environment類調(diào)用其方法**getProperty(屬性key)**即可 |
@Value | @Value注解是Spring框架提供的用于注入配置屬性值的注解,它可用于類的成員變量、方法參數(shù)和構(gòu)造函數(shù)參數(shù)上, 在應(yīng)用程序啟動(dòng)時(shí),使用 @Value 注解的 Bean 會(huì)被實(shí)例化。所有使用了 @Value 注解的 Bean 會(huì)被加入到 PropertySourcesPlaceholderConfigurer 的后置處理器集合中。當(dāng)后置處理器開始執(zhí)行時(shí),它會(huì)讀取 Bean 中所有 @Value 注解所標(biāo)注的值,并通過反射將解析后的屬性值賦值給標(biāo)有 @Value 注解的成員變量、方法參數(shù)和構(gòu)造函數(shù)參數(shù)。重要?。?! ??注意 ①在使用 @Value 注解時(shí)需要確保注入的屬性值已經(jīng)加載到 Spring 容器中,否則會(huì)導(dǎo)致注入失??; ②建議引用變量的時(shí)候給定一個(gè)默認(rèn)值,避免啟動(dòng)報(bào)“缺失配置”的錯(cuò)誤; ③通過依賴注入的方式獲取對(duì)象中屬性值,切記不要使用new的方式來創(chuàng)建對(duì)象獲取其屬性。 |
@ConfigurationProperties | SpringBoot 提供的一種更加便捷來處理配置文件中的屬性值的方式,可以通過自動(dòng)綁定和類型轉(zhuǎn)換等機(jī)制,將指定前綴的屬性集合自動(dòng)綁定到一個(gè)Bean對(duì)象上。 |
@PropertySources | @PropertySources 注解的實(shí)現(xiàn)原理相對(duì)簡單,應(yīng)用程序啟動(dòng)時(shí)掃描所有被該注解標(biāo)注的類,獲取到注解中指定自定義配置文件的路徑,將指定路徑下的配置文件內(nèi)容加載到 Environment 中,這樣可以通過 @Value 注解或 Environment.getProperty() 方法來獲取其中定義的屬性值了。默認(rèn)只限讀取properties文件內(nèi)容,想加載yaml文件內(nèi)容,可以自定義factory適配器,指定factory具體的使用 |
YamlPropertiesFactoryBean對(duì)象 | 只限讀取yaml文件,通過 @Value 注解或 Environment.getProperty() 方法來配合著獲取其中定義的屬性值。 |
JAVA原生 | 通過java.util.Properties去加載配置文件中的屬性。 |
一、Environment
注入Environment類調(diào)用其方法getProperty(屬性key)即可
@Slf4j @SpringBootTest public class EnvironmentTest { @Resource private Environment env; @Test public void var1Test() { String var1 = env.getProperty("env.var1"); log.info("Environment獲取的配置內(nèi)容:{}", var1); } }
二、@Value 注解
只要在變量上加注解 @Value("${env.var1}")就可以了,@Value 注解會(huì)自動(dòng)將配置文件中的env.var1屬性值注入到var1字段中。
@Slf4j @SpringBootTest public class EnvVariablesTest { @Value("${env.var1}") private String var1; @Test public void var1Test(){ log.info("配置文件屬性: {}",var1); } }
三、@ConfigurationProperties 注解
在 application.yml 配置文件中添加配置項(xiàng):
env: var1: 變量值1 var2: 變量值2
創(chuàng)建一個(gè) MyConf 類用于承載所有前綴為env的配置屬性。
@Data @Configuration @ConfigurationProperties(prefix = "env") public class MyConf { private String var1; private String var2; }
在需要使用var1、var2屬性值的地方,將 MyConf 對(duì)象注入到依賴對(duì)象中即可。
@Slf4j @SpringBootTest public class ConfTest { @Resource private MyConf myConf; @Test public void myConfTest() { log.info("@ConfigurationProperties注解獲取的配置內(nèi)容:{}", JSON.toJSONString(myConf)); } }
四、@PropertySources 注解
在 src/main/resources/ 目錄下創(chuàng)建自定義配置文件 important.properties,增加兩個(gè)屬性。
env.var1=變量值1 env.var2=變量值2
在需要使用自定義配置文件的類上添加 @PropertySources 注解,注解 value屬性中指定自定義配置文件的路徑,可以指定多個(gè)路徑,用逗號(hào)隔開。
@Data @Configuration @PropertySources({ @PropertySource(value = "classpath:important.properties", encoding = "utf-8"), @PropertySource(value = "classpath:important.properties",encoding = "utf-8") }) public class PropertySourcesConf { @Value("${env.var1}") private String var1; @Value("${env.var2}") private String var2; }
五、YamlPropertiesFactoryBean 加載 YAML 文件
@Configuration public class MyYamlConfig { @Bean public static PropertySourcesPlaceholderConfigurer yamlConfigurer() { PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean(); yaml.setResources(new ClassPathResource("test.yml")); configurer.setProperties(Objects.requireNonNull(yaml.getObject())); return configurer; } }
可以通過 @Value 注解或 Environment.getProperty() 方法來獲取其中定義的屬性值。
@Slf4j @SpringBootTest public class YamlTest { @Value("${env.var3}") private String var3; @Test public void myYamlTest() { log.info("Yaml獲取配置內(nèi)容:{}", var3); } }
六、JAVA原生讀取
@Slf4j @SpringBootTest public class CustomTest { @Test public void customTest() { Properties props = new Properties(); try { InputStreamReader inputStreamReader = new InputStreamReader( this.getClass().getClassLoader().getResourceAsStream("test.properties"), StandardCharsets.UTF_8); props.load(inputStreamReader); } catch (IOException e1) { System.out.println(e1); } log.info("Properties Name:" + props.getProperty("env.appName")); } }
以上就是SpringBoot加載配置6種方式分析的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot加載配置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot項(xiàng)目網(wǎng)頁加載出現(xiàn)Whitelabel?Error?Page的解決
這篇文章主要介紹了SpringBoot項(xiàng)目網(wǎng)頁加載出現(xiàn)Whitelabel?Error?Page的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11SpringBoot項(xiàng)目創(chuàng)建單元測(cè)試的流程步驟
在日常開發(fā)的過程中,對(duì)自己的代碼進(jìn)行單元測(cè)試是個(gè)非常重要的過程,一方面可以最小范圍的針對(duì)一個(gè)方法進(jìn)行測(cè)試,提高測(cè)試的簡便性以及測(cè)試的成本,本篇文章主要是為了總結(jié)一下如何優(yōu)雅的在Springboot項(xiàng)目中使用單元測(cè)試去測(cè)試功能,需要的朋友可以參考下2024-11-11Spring實(shí)戰(zhàn)之FileSystemResource加載資源文件示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之FileSystemResource加載資源文件,結(jié)合實(shí)例形式分析了spring FileSystemResource加載xml資源文件的具體實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2019-12-12Java?集合框架掌握?Map?和?Set?的使用(內(nèi)含哈希表源碼解讀及面試??碱})
這篇文章主要介紹了Java?集合框架掌握?Map?和?Set?的使用并含有內(nèi)含哈希表源碼解讀及面試常考題,?Map?和?Set?是一種適合動(dòng)態(tài)查找的集合容器或者數(shù)據(jù)結(jié)構(gòu)下面文章詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2021-12-12