SpringBoot加載配置6種方式分析
引言
從配置文件中獲取屬性應(yīng)該是SpringBoot開發(fā)中最為常用的功能之一,但就是這么常用的功能,仍然有很多開發(fā)者抓狂~今天帶大家簡(jiǎn)單回顧一下這六種的使用方式:
| 說明 | |
|---|---|
| Environment對(duì)象 | Environment 是 springboot 核心的環(huán)境配置接口,它提供了簡(jiǎn)單的方法來訪問應(yīng)用程序?qū)傩?,包括系統(tǒng)屬性、操作系統(tǒng)環(huán)境變量、命令行參數(shù)、和應(yīng)用程序配置文件中定義的屬性等等,使用 Environment 方式來獲取配置屬性值非常簡(jiǎn)單,只要注入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ì)簡(jiǎn)單,應(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)文章
MyBatis詳細(xì)執(zhí)行流程的全紀(jì)錄
這篇文章主要給大家介紹了關(guān)于MyBatis詳細(xì)執(zhí)行流程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
SpringRunner和SpringJUnit4ClassRunner區(qū)別小結(jié)
SpringRunner 和 SpringJUnit4ClassRunner 是用于在JUnit測(cè)試中與Spring測(cè)試框架集成的兩個(gè)類,本文主要介紹了SpringRunner和SpringJUnit4ClassRunner區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2025-10-10
Java定時(shí)任務(wù)Schedule的基本用法及Cron表達(dá)式實(shí)踐記錄
本文介紹了Spring框架提供的@Scheduled注解和cron表達(dá)式在Java定時(shí)任務(wù)中的應(yīng)用,詳細(xì)講解了基礎(chǔ)配置、Cron表達(dá)式解析以及進(jìn)階用法和注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧2026-01-01
Java中利用BitMap位圖實(shí)現(xiàn)海量級(jí)數(shù)據(jù)去重
有許多方法可以用來去重,比如使用列表、集合等等,但這些方法通常只適用于一般情況,然而,當(dāng)涉及到大量數(shù)據(jù)去重時(shí),常見的 Java Set、List,甚至是 Java 8 的新特性 Stream 流等方式就顯得不太合適了,本文給大家介紹了Java中利用BitMap位圖實(shí)現(xiàn)海量級(jí)數(shù)據(jù)去重2024-04-04
Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法
這篇文章主要介紹了Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
SpringBoot結(jié)合FreeMarker視圖渲染的實(shí)現(xiàn)
FreeMarker它允許開發(fā)人員使用模板和數(shù)據(jù)來生成輸出文本,如HTML網(wǎng)頁、電子郵件、配置文件和源代碼等,本文主要介紹了SpringBoot結(jié)合FreeMarker視圖渲染的實(shí)現(xiàn),感興趣的可以了解一下2024-03-03
mybatis-xml映射文件及mybatis動(dòng)態(tài)sql詳解
XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下(同包同名),這篇文章主要介紹了mybatis-xml映射文件及mybatis動(dòng)態(tài)sql的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2024-12-12
springboot中如何通過main方法調(diào)用service或dao
這篇文章主要介紹了springboot中如何通過main方法調(diào)用service或dao,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02

