Spring讀取配置文件 @Value

来源:https://www.cnblogs.com/lvbinbin2yujie/archive/2019/01/15/10274663.html
-Advertisement-
Play Games

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

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以下為DI控制反轉個人理解煩請各位大牛指教~ 編寫程式時我們應當遵循抵耦合高內聚的原則(各個功能模塊互不依賴). 我們可以利用面向對象裡面介面的特性來進行DI控制反轉,讓功能模塊全部依賴介面,而不依賴具體的實現類,當程式跑起來以後通過註入的方式註入具體的實現類如以下代碼: 這樣,購物車類就實現了松耦 ...
  • 內容過程,把做工程過程較好的內容片段備份一次,如下的內容是關於 JavaBean到JSon格式的轉換例子的內容,應該對各朋友有一些用處。 User u = new User(); u.setId(1); u.setName("lizhi"); u.setAge(24); u.setHeigh("17 ...
  • 本篇主要介紹的是SpringCloud中的服務消費者(Feign)和負載均衡(Ribbon)功能的實現以及使用Feign結合Ribbon實現負載均衡。 ...
  • 1、習題 4: 更多的變數和列印 學習目標: 瞭解用戶輸入方法,明白pthon2和Python3之間的用戶輸入的區別。瞭解格式化字元串(format string)的概念,學會如何創建包含變數內容的字元串。使用專門的格式和語法把變數的內容放到字元串里,然後進行格式化的列印輸出。 1.1、用戶輸入 在 ...
  • 一、概述 只要用框架開發java,一定躲不過spring,Spring是一個輕量級的Java開源框架,存在的目的是用於構建輕量級的J2EE應用。Spring的核心是控制反轉(IOC)和麵向切麵編程(AOP)。spring有如下特點: 輕量級:應用大小和應用開支,包括應用方式 DI/IoC:提供松耦合 ...
  • Spring Security(三) 個性化用戶認證流程 自定義登錄頁面 在配置類中指定登錄頁面和接收登錄的 url 在項目中新建登錄頁面 啟動項目時再訪問 Security 就會跳轉到你自已定義的登陸頁面讓你登錄。 深入定義(判斷是PC端還是移動端,PC端跳轉頁面,移動端響應 json) 創建一個 ...
  • 今天在家裡的Linux系統上,試著搭建Eclipse C/C++開發環境,最後終獲成功。下麵貼上兩篇對搭建過程很有幫助的文章 用 Eclipse 平臺進行 C/C++ 開發 https://www.ibm.com/developerworks/cn/linux/opensource/os-ecc/ ...
  • PEP8編碼規範是一種非常優秀的編碼規範,也得到了Python程式員的普遍認可,如果實踐中或者項目中沒有統一的編碼規範,建議儘量遵循PEP8編碼規範,當然如果項目中已經有了自身的編碼規範,應當優先遵循自身的編碼規範,哪怕原先的代碼風格在你看來很糟糕,也要儘量與源代碼風格保持一致。原文地址:https ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...