溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring中怎樣動態(tài)讀取配置文件

發(fā)布時間:2021-09-14 13:36:42 來源:億速云 閱讀:205 作者:小新 欄目:開發(fā)技術

這篇文章主要介紹Spring中怎樣動態(tài)讀取配置文件,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Spring 動態(tài)讀取配置文件

需求背景

最近碰到的需求大概是這樣,我們要在一個現有的項目基礎上進行二次開發(fā),但又不愿意碰原有項目里的代碼。所以采用了Maven依賴的方式——新建一個Maven項目作為主要開發(fā)環(huán)境,將原有項目作為Maven依賴(war形式)引入進來。這樣在新建的擴展項目中打包出來的war將會是合并兩個項目的所有代碼。

而在實際搭建的過程中碰到這樣一個問題,Spring配置文件中的 <context:property-placeholder />只允許存在一個, 而且這個機會已經被原有項目使用了——這種說法并不嚴謹,所以以下給出三種解決方案:

方案一

以上關于<context:property-placeholder />的說法并不嚴謹,其實多次添加也不會報錯; 但只會有一個生效(含義是 如果spring從所設置的配置文件集合中沒有讀取到屬性去替換占位符,就會報錯, 除非設置 ignore-unresolvable ) ,如果按照如下設置方式,就可以避免這種情況,并接觸本次需求。

<!-- 如果要配置多個, 就要設置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ā)現錯誤的時機推遲到了運行時,這在系統(tǒng)比較龐大時實在是大忌。

2. 屬性重復時的替換危機,這種BUG想要找出來,耗費的時間和精力想想就不寒而栗。

方案二

第二個方法 就是BeanFactoryPostProcessor接口,注意該接口的回調時機早于占位符替換 操作。

// 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的父子容器的關系,將這個 <context:property-placeholder/>和依賴它的Bean全部注冊到一個全新容器中,然后將該容器作為現有容器的Parent。此方法過去取巧,本人沒有實際去嘗試。

動態(tài)讀取配置文件中的信息

1、首先是寫一個配置文件,方便動態(tài)加載

jedis.properties

key-value形式保存

Spring中怎樣動態(tài)讀取配置文件

1、利用類加載器等讀取配置文件

1.讀取配置文件

InputStream is=JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");

2.創(chuàng)建properties對象

Properteis pro=new Properties();

3.關聯文件

pro.load(is);

4.然后在項目中可以動態(tài)加載key獲取到value值

Spring中怎樣動態(tài)讀取配置文件

以上是“Spring中怎樣動態(tài)讀取配置文件”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI