Spring讀取配置文件 @Value


最近在學習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參數:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM