最近在學習Spring如何讀取配置文件,記錄下方便自己也方便別人; 大致分為兩類吧,一種的思路是利用Spring的beanFactoryPostProcessor讀取配置文件內容到記憶體中,也就是應用程式的某個對象的屬性中,然後設置上去; 另外一種思路就是SPEL表達式,這是Spring3.x的特性, ...
最近在學習Spring如何讀取配置文件,記錄下方便自己也方便別人;
大致分為兩類吧,一種的思路是利用Spring的beanFactoryPostProcessor讀取配置文件內容到記憶體中,也就是應用程式的某個對象的屬性中,然後設置上去; 另外一種思路就是SPEL表達式,這是Spring3.x的特性,依賴於Spring expression;
簡單介紹下 #{}和 ${}用法上一個小的區別:
${}如果需要寫預設值的話 ${keyname : defaultValue }
#{}如果需要寫預設值的話 #{ 表達式 ?: defaultValue }
第一種思路
方式一. 假設當前需求是讀取某個properties文件,然後再spring XML中給對象設置屬性的時候賦值;
step1.首先是如何將properties文件讀取到記憶體中:使用ProperyPlaceHolderConfigurer對象
方案A:
如果有多個配置文件,那繼續添加<value>文件資源位置</value>
或者使用下麵的bean對象PropertySourcesPlaceHolderConfigurer;
方案B:
再或者使用context標簽來完成: 如果有多個文件資源,使用,作為分隔符 ;其實後兩種方式就是一種方式,propert-placeholder標簽就是註冊的PropertySourcesPlaceHolderConfigurer
方案C:
step2.第二步就是從記憶體中讀取key-value並且設置到對象的屬性上
在Spring的配置文件中,使用 ${鍵名} 的方式就可以註入; 註意:屬性需要有對應的set方法才能夠將值設置上去,static類型的變數也可以通過這種方法設置;
註意點:${}是支持嵌套的,比如下麵的 ${${name}} 就等價於lvbb ${${name}1}就等價於lq
方式二. 假如項目中的bean是用的註解(我知道的四個 @Controller、@Service、@Component、@Repository),沒有在Xml配置文件中定義;
step1同方式一的step1,三種方式都是可行的,額外多一種方式 定義了,其實和前面三種方式沒太大區別,就是PropertyPlaceHolderConfigurer的子類;
step2
需要<context:component-scan/>標簽開始包掃描,使用註解方式的bean,這樣才會掃描到@Value註解
Value註解可以標註在屬性上,也可以標註在set方法上;
@Value註解同樣支持${ }嵌套,但是static類型的屬性 我測試的時候發現是無法設置上去的。
第二種思路 SPEL表達式
#{}形式為SpringEl表達式,簡稱SPEL, 詳細的博客見作者鏈接 :https://blog.csdn.net/ya_1249463314/article/details/68484422
SPEL表達式有點類似OGNL表達式,通常使用都是#{對象名.對象屬性}來獲取屬性;
方式一. @Value註解配合 #{}表達式
step1.讀取properties文件方式. 使用的是PropertiesFactoryBean,其實獲取的就是Properties對象,對象名為configProperties
step2.開啟@Component、@Service等註解,以及最重要的@Value註解開啟使用; @Value註解開啟是依賴於註冊了AutowiredAnnotationBeanPostProcessor這個beanPostProcessor,而<context:component-scan/>就
幫我們完成了註冊這個AutowiredAnnotationBeanPostProcessor,所以才能夠使用@Value註解;
config.properties文件如下:
SPEL使用方式如下:
#{}推薦寫成 #{對象名[‘屬性名’]}的形式,因為屬性名包含 . 分隔符的話不加單引號會解析報錯;其中configProperties就是之前的Properties對象 id
此外系統JVM的參數,即System.getProperties()的參數可以直接EL表達式使用; #{systemProperties['屬性名']}
當然了系統JVM參數使用${}同樣可以註入:
博客最後附上我的JVM的參數,圖片較長見最後。
再次附上介紹SPEL的鏈接,https://blog.csdn.net/ya_1249463314/article/details/68484422
SpEl表達式比較複雜,我也只是簡單會用,具體實現在Spring-expression中,就像剛接觸Spring一樣,難以理解;
簡單附上Spring解析El 表達式的demo,大致流程就是:傳入了beanFactory,然後根據 id 查找 bean 就去beanFactory中查找.
JVM參數: