Spring技巧之如何動(dòng)態(tài)讀取配置文件
Spring 動(dòng)態(tài)讀取配置文件
需求背景
最近碰到的需求大概是這樣,我們要在一個(gè)現(xiàn)有的項(xiàng)目基礎(chǔ)上進(jìn)行二次開發(fā),但又不愿意碰原有項(xiàng)目里的代碼。所以采用了Maven依賴的方式——新建一個(gè)Maven項(xiàng)目作為主要開發(fā)環(huán)境,將原有項(xiàng)目作為Maven依賴(war形式)引入進(jìn)來。這樣在新建的擴(kuò)展項(xiàng)目中打包出來的war將會(huì)是合并兩個(gè)項(xiàng)目的所有代碼。
而在實(shí)際搭建的過程中碰到這樣一個(gè)問題,Spring配置文件中的 <context:property-placeholder />只允許存在一個(gè), 而且這個(gè)機(jī)會(huì)已經(jīng)被原有項(xiàng)目使用了——這種說法并不嚴(yán)謹(jǐn),所以以下給出三種解決方案:
方案一
以上關(guān)于<context:property-placeholder />的說法并不嚴(yán)謹(jǐn),其實(shí)多次添加也不會(huì)報(bào)錯(cuò); 但只會(huì)有一個(gè)生效(含義是 如果spring從所設(shè)置的配置文件集合中沒有讀取到屬性去替換占位符,就會(huì)報(bào)錯(cuò), 除非設(shè)置 ignore-unresolvable ) ,如果按照如下設(shè)置方式,就可以避免這種情況,并接觸本次需求。
<!-- 如果要配置多個(gè), 就要設(shè)置ignore-unresolvable ="true" --> <context:property-placeholder location="classpath:extend/db.properties" ignore-unresolvable="true" /> <context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true" />
但是這樣帶來的壞處就是:
1. 將發(fā)現(xiàn)錯(cuò)誤的時(shí)機(jī)推遲到了運(yùn)行時(shí),這在系統(tǒng)比較龐大時(shí)實(shí)在是大忌。
2. 屬性重復(fù)時(shí)的替換危機(jī),這種BUG想要找出來,耗費(fèi)的時(shí)間和精力想想就不寒而栗。
方案二
第二個(gè)方法 就是BeanFactoryPostProcessor接口,注意該接口的回調(diào)時(shí)機(jī)早于占位符替換 操作。
// BeanFactoryPostProcessor.postProcessBeanFactory
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 我們自己去讀取指定的配置文件
Properties prop = null ;
try {
prop = PropertiesLoaderUtils.loadAllProperties("extend/db.properties", Thread.currentThread().getContextClassLoader());
} catch (IOException e) {
e.printStackTrace();
}
if(null == prop){
return;
}
// 注入到特定的Bean的特定屬性中
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("dataSource_extend");
beanDefinition.getPropertyValues().add("url", prop.getProperty("db.sd.url"));
beanDefinition.getPropertyValues().add("driverClassName",prop.getProperty("db.sd.driverClassName"));
beanDefinition.getPropertyValues().add("username", prop.getProperty("db.sd.username"));
beanDefinition.getPropertyValues().add("password", prop.getProperty("db.sd.password"));
super.postProcessBeanFactory(beanFactory);
}
方案三
還有一種方法就是使用Spring的父子容器的關(guān)系,將這個(gè) <context:property-placeholder/>和依賴它的Bean全部注冊(cè)到一個(gè)全新容器中,然后將該容器作為現(xiàn)有容器的Parent。此方法過去取巧,本人沒有實(shí)際去嘗試。
動(dòng)態(tài)讀取配置文件中的信息
1、首先是寫一個(gè)配置文件,方便動(dòng)態(tài)加載
jedis.properties
key-value形式保存

1、利用類加載器等讀取配置文件
1.讀取配置文件
InputStream is=JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
2.創(chuàng)建properties對(duì)象
Properteis pro=new Properties();
3.關(guān)聯(lián)文件
pro.load(is);
4.然后在項(xiàng)目中可以動(dòng)態(tài)加載key獲取到value值

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springcloud整合gateway實(shí)現(xiàn)網(wǎng)關(guān)的示例代碼
本文主要介紹了springcloud整合gateway實(shí)現(xiàn)網(wǎng)關(guān)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
如何使用IDEA開發(fā)Spark SQL程序(一文搞懂)
Spark SQL 是一個(gè)用來處理結(jié)構(gòu)化數(shù)據(jù)的spark組件。它提供了一個(gè)叫做DataFrames的可編程抽象數(shù)據(jù)模型,并且可被視為一個(gè)分布式的SQL查詢引擎。這篇文章主要介紹了如何使用IDEA開發(fā)Spark SQL程序(一文搞懂),需要的朋友可以參考下2021-08-08
Spring Boot 中使用 JSON Schema 校驗(yàn)復(fù)雜JSO
在數(shù)據(jù)交換領(lǐng)域,JSON Schema 以其強(qiáng)大的標(biāo)準(zhǔn)化能力,為定義和規(guī)范 JSON 數(shù)據(jù)的結(jié)構(gòu)與規(guī)則提供了有力支持,下面給大家介紹Spring Boot 中使用 JSON Schema 校驗(yàn)復(fù)雜JSON數(shù)據(jù)的過程,感興趣的朋友跟隨小編一起看看吧2024-08-08
EventBus與Spring Event區(qū)別詳解(EventBus 事件機(jī)制,Spring Event事件機(jī)制)
這篇文章主要介紹了EventBus與Spring Event區(qū)別,需要的朋友可以參考下2020-02-02
Springboot 整合 Java DL4J 打造文本摘要生成系統(tǒng)
本文介紹了如何使用SpringBoot整合JavaDeeplearning4j構(gòu)建文本摘要生成系統(tǒng),該系統(tǒng)能夠自動(dòng)從長篇文本中提取關(guān)鍵信息,生成簡(jiǎn)潔的摘要,幫助用戶快速了解文本的主要內(nèi)容,技術(shù)實(shí)現(xiàn)包括使用LSTM神經(jīng)網(wǎng)絡(luò)進(jìn)行模型構(gòu)建和訓(xùn)練,并通過SpringBoot集成RESTfulAPI接口2024-11-11
Spring的RedisTemplate存儲(chǔ)的key和value有特殊字符的處理
這篇文章主要介紹了Spring的RedisTemplate存儲(chǔ)的key和value有特殊字符的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
SpringBoot項(xiàng)目啟動(dòng)報(bào)錯(cuò)"找不到或無法加載主類"的解決方法
在使用 IntelliJ IDEA 開發(fā)基于 Spring Boot 框架的 Java 程序時(shí),可能會(huì)出現(xiàn)找不到或無法加載主類 com.example.springboot.SpringbootApplication的錯(cuò)誤提示,下面我們來看看如何解決吧2025-03-03
詳解Spark?Sql在UDF中如何引用外部數(shù)據(jù)
這篇文章主要為大家介紹了詳解Spark?Sql在UDF中如何引用外部數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

