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