Spring中@PropertySource注解使用場(chǎng)景解析
一、簡(jiǎn)單介紹
在日常開發(fā)中,你有沒有遇到過這樣一種場(chǎng)景:項(xiàng)目中需要編寫很多配置文件,將一些系統(tǒng)信息配置化
此時(shí),往往需要編寫專門的工具類或者方法來(lái)讀取并解析這些配置文件,將配置文件中的配置項(xiàng)內(nèi)容加載到系統(tǒng)內(nèi)存中。
后續(xù)在使用這些配置項(xiàng)時(shí),可以直接通過工具類或者方法獲取加載到內(nèi)存中的配置項(xiàng)。
@PropertySource注解就是Spring中提供的一個(gè)可以加載配置文件的注解,并且可以將配置文件中的內(nèi)容存放到Spring的環(huán)境變量中。
二、注解說(shuō)明
@PropertySource注解是Spring中提供的一個(gè)通過指定配置文件位置來(lái)加載配置文件的注解,并且可以將配置文件中的內(nèi)容存放到Spring的環(huán)境變量中。
除了可以通過Spring的環(huán)境變量讀取配置項(xiàng)之外,還可以通過@Value注解獲取配置項(xiàng)的值。
另外,Spring中還提供了一個(gè)@PropertySources注解,在@PropertySources注解中,可以引入多個(gè)@PropertySource注解。
1. 注解源碼
Spring中提供了@PropertySource和@PropertySources兩個(gè)注解來(lái)加載配置文件。
① @PropertySource注解
@PropertySource注解只能標(biāo)注到類上,能夠通過指定配置文件的位置來(lái)加載配置文件,@PropertySource注解除了可以加載properties配置文件外,也可以加載xml配置文件和yml配置文件。如果加載yml配置文件時(shí),可以自定義PropertySourceFactory實(shí)現(xiàn)yml配置文件的解析操作。
@PropertySource注解的源碼詳見:
/**
* @author Chris Beams
* @author Juergen Hoeller
* @author Phillip Webb
* @author Sam Brannen
* @since 3.1
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(PropertySources.class)
public @interface PropertySource {
String name() default "";
String[] value();
/**
* @since 4.0
*/
boolean ignoreResourceNotFound() default false;
/**
* @since 4.3
*/
String encoding() default "";
/**
* @since 4.3
*/
Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class;
}
從源碼可以看出,@PropertySource注解是從Spring3.1版本開始提供的注解,注解中各個(gè)屬性的含義如下所示:
- name:表示加載的資源的名稱,如果為空,則會(huì)根據(jù)加載的配置文件自動(dòng)生成一個(gè)名稱。
- value:表示加載的資源的路徑,這個(gè)路徑可以是類路徑,也可以是文件路徑。
- ignoreResourceNotFound:表示當(dāng)配置文件未找到時(shí),是否忽略文件未找到的錯(cuò)誤。默認(rèn)值為false,也就是說(shuō)當(dāng)未找到配置文件時(shí),Spring啟動(dòng)就會(huì)報(bào)錯(cuò)。
- encoding:表示解析配置文件使用的字符集編碼。
- factory:表示讀取對(duì)應(yīng)配置文件的工廠類,默認(rèn)的工廠類是PropertySourceFactory。
② @PropertySources注解
除了@PropertySource注解,Spring中還提供了一個(gè)@PropertySources注解。
/**
* @author Phillip Webb
* @since 4.0
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PropertySources {
PropertySource[] value();
}
從源碼可以看出,@PropertySources是從Spring4.0版本開始提供的注解,在@PropertySources注解中,只提供了一個(gè)PropertySource數(shù)組類型的value屬性。
所以,@PropertySources注解可以引入多個(gè)@PropertySource注解。
2. 注解使用場(chǎng)景
在基于Spring的注解開發(fā)項(xiàng)目的過程中,由于不再使用Spring的XML文件進(jìn)行配置,如果將配置項(xiàng)直接寫到類中,就會(huì)造成配置項(xiàng)與類的緊耦合,后續(xù)對(duì)于配置項(xiàng)的修改操作非常不方便,不利于項(xiàng)目的維護(hù)和擴(kuò)展。
此時(shí),可以將這些配置項(xiàng)寫到properties文件或者yml文件中,通過@PropertySource注解加載配置文件。
另外,如果項(xiàng)目本身就存在大量的properties配置文件或者yml配置文件,也可以統(tǒng)一由Spring的@PropertySource注解進(jìn)行加載。
3. 使用案例
本節(jié),主要實(shí)現(xiàn)一個(gè)通過@PropertySource注解加載properties配置文件,將properties配置文件中的配置項(xiàng)加載到Spring的環(huán)境變量中,獲取Spring環(huán)境變量中配置項(xiàng)的值,并進(jìn)行打印。
案例的具體實(shí)現(xiàn)步驟如下所示。
(1)新增test.properties文件
resources目錄下新增test.properties文件,文件內(nèi)容如下所示:
name=lwk age=18
(2)新增PropertySourceConfig類
@Configuration
@PropertySource(value = "classpath:test.properties")
public class PropertySourceConfig {
}
可以看到,PropertySourceConfig類是Spring的配置類,并且使用@PropertySource注解指定了test.properties配置文件的路徑。
(3)新增PropertySourceTest類
public class PropertySourceTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PropertySourceConfig.class);
ConfigurableEnvironment environment = context.getEnvironment();
System.out.println(environment.getProperty("name") + " ====>>> " + environment.getProperty("age"));
}
}
可以看到,在PropertySourceTest類的main()方法中,通過AnnotationConfigApplicationContext類的對(duì)象獲取到ConfigurableEnvironment類型的環(huán)境變量對(duì)象environment,然后通過environment對(duì)象獲取配置文件中的name和age的值并進(jìn)行打印。
(4)運(yùn)行PropertySourceTest類
可以看到,正確的輸出了配置文件中的值。
lwk ====>>> 18
說(shuō)明:使用@PropertySource注解可以加載properties配置文件中的配置項(xiàng),并將配置項(xiàng)加載到Spring的環(huán)境變量中,通過Spring的環(huán)境變量就可以獲取到配置項(xiàng)的值。
到此這篇關(guān)于Spring中@PropertySource注解使用場(chǎng)景解析的文章就介紹到這了,更多相關(guān)Spring的@PropertySource注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成OAuth2.0的實(shí)現(xiàn)示例
OAuth2.0是安全授權(quán)協(xié)議,通過訪問令牌替代密碼,保障用戶數(shù)據(jù)安全,適用于社交登錄、第三方數(shù)據(jù)訪問等場(chǎng)景,下面就來(lái)介紹一下SpringBoot集成OAuth2.0,感興趣的可以了解一下2025-06-06
java導(dǎo)出Excel(非模板)可導(dǎo)出多個(gè)sheet方式
Java開發(fā)中,導(dǎo)出Excel是常見需求,有時(shí)需要支持多個(gè)Sheet導(dǎo)出,此技巧介紹非模板方式實(shí)現(xiàn)單標(biāo)題單Sheet以及多Sheet導(dǎo)出,標(biāo)題一致或不一致均可,可換成Map使用,適合個(gè)人開發(fā)者和需要Excel導(dǎo)出功能的場(chǎng)景2024-09-09
現(xiàn)代高效的java構(gòu)建工具gradle的快速入門
和Maven一樣,Gradle只是提供了構(gòu)建項(xiàng)目的一個(gè)框架,真正起作用的是Plugin,本文主要介紹了gradle入門,文中通過示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下2021-11-11
關(guān)于JAVA_HOME路徑修改之后JDK的版本依然不更改的解決辦法
今天小編就為大家分享一篇關(guān)于JAVA_HOME路徑修改之后JDK的版本依然不更改的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
Java日期時(shí)間與正則表達(dá)式超詳細(xì)整理(適合新手入門)
如果使用得當(dāng),正則表達(dá)式是匹配各種模式的強(qiáng)大工具,下面這篇文章主要給大家介紹了關(guān)于Java日期時(shí)間與正則表達(dá)式超詳細(xì)整理的相關(guān)資料,本文非常適合新手入門,需要的朋友可以參考下2023-04-04
java高并發(fā)鎖的3種實(shí)現(xiàn)示例代碼
本篇文章主要介紹了java高并發(fā)鎖的3種實(shí)現(xiàn)示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-08-08
Java案例實(shí)現(xiàn)不重復(fù)的隨機(jī)數(shù)
這篇文章主要介紹了Java案例實(shí)現(xiàn)不重復(fù)的隨機(jī)數(shù),通過創(chuàng)建Set集合對(duì)象,可以使用HashSet也可以使用TreeSet,區(qū)別在于TreeSet是排序后的,創(chuàng)建隨機(jī)數(shù)對(duì)象,獲取一個(gè)隨機(jī)數(shù)去重等操作,需要的朋友可以參考一下2022-04-04

