spring加載外部properties文件屬性時,讀取到userName變量值和properties文件的值不一致

問題

使用spring DI注入外部properties文件屬性時,讀取到userName變量值和properties文件的值不一致。
bean屬性注入:

 <!--加載配置文件-->
<context:property-placeholder location="classpath:*.properties"/><bean id="userDao" class="com.fjd.dao.impl.UserDaoImpl"><property name="userName" value="${userName}"/><property name="password" value="${password}"/>
</bean>

properties文件內容:
在這里插入圖片描述
輸出結果:
在這里插入圖片描述

原因分析

問題的根源在于:系統環境變量與屬性文件中的變量名沖突。在Spring 中,${} 占位符會按特定順序解析屬性源,而系統環境變量優先級高于 properties 文件。

  • 沖突的變量名:
    • userName 是常見系統環境變量(存儲當前登錄用戶名)
    • properties 文件也定義了同名變量
  • Spring 屬性解析順序:
    • 當使用 ${userName} 時,Spring 按此順序查找:
  1. JVM 系統屬性 (-D 參數)
  2. 操作系統環境變量 👉 這里找到了系統用戶名!
  3. properties 文件中的屬性

解決方法

方案 1:重命名屬性(推薦)
  • 修改 properties 文件,添加前綴避免沖突:
# 修改后
db.userName=root
db.password=123
  • 修改 Spring 配置:
<bean id="userDao" class="com.fjd.dao.impl.UserDaoImpl"><property name="userName" value="${db.userName}"/><property name="password" value="${db.password}"/>
</bean>
方案 2:調整屬性源優先級(Spring 4.3+)

在 PropertySourcesPlaceholderConfigurer 中顯式設置優先級:

<bean  <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"><property name="locations"><list><value>classpath*:data.properties</value></list></property><!-- 關鍵:讓本地屬性覆蓋系統環境變量 --><property name="localOverride" value="true"/></bean>

注意:確保上述bean是在applicationContext.xml文件中第一個定義的bean

  • 為什么要作為第一個定義的bean(額外知識點!)
    1.Spring 容器初始化順序
    在這里插入圖片描述
    2.關鍵機制解析
BeanFactoryPostProcessor 的特殊性:
PropertySourcesPlaceholderConfigurer實現了BeanFactoryPostProcessor 接口
后置處理器優先:BeanFactoryPostProcessor 必須先于普通 bean
這類 bean 會在普通 bean 實例化之前執行
但多個 BeanFactoryPostProcessor 之間仍有執行順序

????????3.工作流程

Spring 首先初始化 PropertySourcesPlaceholderConfigurer
它立即加載 data.properties 并注冊到環境
設置 localOverride=true 使這些屬性覆蓋系統環境變量
當初始化 userDao 時,${userName} 已使用文件中的值

????????4.位置決定執行順序:

XML中先定義的BeanFactoryPostProcessor先執行,如果放在后面,
可能其他處理器已修改了環境

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89881.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

黑馬點評系列問題之基礎篇p7 06初識redis無法在虛擬機查到圖形化界面存進去的鍵

問題描述 在RESP中輸入了一些鍵(name,age等這些) 但是在圖形化界面里面輸入的&#xff0c;在非圖形化界面就找不到&#xff0c;在非圖形化界面里輸入的&#xff0c;在圖形化界面里就可以查到。 原因分析及解決 經過多次實驗&#xff0c;發現是因為在添加鍵名的時候&#xff0…

在VMware虛擬機中安裝Windows 98時,Explorer提示“該程序執行了非法操作,即將關閉”的解決辦法

在使用iso文件&#xff08;MD5: 0E496B5DCC519F550AAF0BCFBB4A11EA&#xff09;安裝Windows98時&#xff0c;遇到此提示。 雖然原因未知&#xff0c;也無需深入探究&#xff0c;但是根據網友在 https://www.bilibili.com/opus/435866522585702782 中給出的相似經驗&#xff…

在瀏覽器中使用SQLite(官方sqlite3.wasm)

有人可能會問&#xff1a;既然瀏覽器里又內置得IndexedDB&#xff0c;而且在IndexedDB里存數據&#xff0c;關了瀏覽器數據也不會丟&#xff0c;為什么還要在瀏覽器里用SQLite? 實際上&#xff0c;當 IndexedDB 內的數據量增多&#xff0c;數據和數據之間的關系變得復雜&…

數據結構(Java)--位運算

前言 本文為本小白學習數據結構的筆記&#xff0c;將以算法題為導向&#xff0c;向大家更清晰的介紹數據結構相關知識&#xff08;算法題都出自B站馬士兵教育——左老師的課程&#xff0c;講的很好&#xff0c;對于想入門刷題的人很有幫助&#xff09; 為什么要使用為位運算 位…

秋招Day14 - Redis - 應用

Redis如何實現異步消息隊列&#xff1f; List配合LPUSH和RPOP。 另外就是用 Redis 的 Pub/Sub 來實現簡單的消息廣播和訂閱。 但是這兩種方式都是不可靠的&#xff0c;因為沒有 ACK 機制所以不能保證訂閱者一定能收到消息&#xff0c;也不支持消息持久化。 Redis如何實現延時…

因果語言模型、自回歸語言模型、僅解碼器語言模型都是同一類模型

因果語言模型、自回歸語言模型、僅解碼器語言模型都是同一類模型 flyfish 因果語言模型&#xff08;causal Language Models&#xff09; 自回歸語言模型&#xff08;autoregressive language models&#xff09; 僅解碼器語言模型&#xff08;decoder-only language models&am…

jvm架構原理剖析篇

簡單題&#xff08;5道&#xff09; 考查內容&#xff1a;JVM運行時數據區域 題干&#xff1a;Java虛擬機棧的主要作用是&#xff1f; A. 存儲對象實例 B. 存儲方法調用和局部變量 C. 存儲靜態字段 D. 存儲字節碼指令 正確答案&#xff1a;B 解析&#xff1a;虛擬機棧用于存儲方…

智鏈萬物:人工智能驅動的產業智能化革命

當生成式AI在藝術與創意領域掀起風暴&#xff0c;大型語言模型重塑信息交互方式時&#xff0c;一場更為基礎、影響更為深遠的變革&#xff0c;正在全球實體經濟的根基處悄然發生并加速推進——這就是產業智能化。它并非簡單的“機器換人”&#xff0c;而是人工智能&#xff08;…

python中上下文管理器 與 try finally有什么區別

目錄 主要區別代碼對比何時使用哪種方式 主要區別 語法簡潔性 上下文管理器使用 with 語句&#xff0c;語法更簡潔優雅try-finally 需要顯式編寫異常處理代碼&#xff0c;更冗長 代碼復用性 上下文管理器可以封裝為類或函數&#xff0c;便于在多處復用try-finally 通常需要在每…

人體屬性識別+跌倒檢測:兒童行為監測與安全升級

智慧幼兒園的AI智能檢測盒應用實踐 背景&#xff1a;傳統園區管理的三大痛點 傳統幼兒園管理長期面臨三大核心挑戰&#xff1a;一是安全監控依賴人工巡查&#xff0c;存在視覺盲區與響應延遲&#xff0c;如某連鎖幼兒園曾因人工巡查疏漏&#xff0c;導致3起兒童跌倒事故未能及…

【ESP32-IDF筆記】09-UART配置和使用

環境配置 Visual Studio Code &#xff1a;版本1.98.2 ESP32&#xff1a;ESP32-S3 ESP-IDF&#xff1a;V5.4 支持型號&#xff1a;ESP32、ESP32-C2、ESP32-C3、ESP32-C5、ESP32-C6、ESP32-C61、ESP32-H2、ESP32-P4、 ESP32-S2、ESP32-S3 簡介 通用異步接收器/發送器 (UART) …

在 .NET Core 和 React 中使用 WebSockets 和 SignalR 進行實時數據傳輸

對于需要即時更新和通知的應用程序來說&#xff0c;實時數據傳輸至關重要。在 .NET Core 中&#xff0c;WebSocket 和 SignalR 提供了強大的工具來實現客戶端和服務器之間的實時通信。在本指南中&#xff0c;我們將探討如何在 .NET Core 應用程序中使用 WebSocket 和 SignalR 實…

第八十六篇 大數據排序算法:從廚房整理到分布式排序的智慧

目錄一、基礎排序算法&#xff1a;生活場景中的計算智慧1.1 冒泡排序&#xff1a;圖書館的書籍整理1.2 插入排序&#xff1a;廚房調料的整理藝術二、高效排序算法&#xff1a;大數據處理的利器2.1 快速排序&#xff1a;音樂APP的智能歌單2.2 歸并排序&#xff1a;學校成績單的合…

開源 | V3.1.1慧知開源重卡運營充電樁平臺 - 重卡運營充電樁平臺管理解決方案;企業級完整代碼 多租戶、模擬器、多運營商、多小程序;

【開源免費版】推薦一套企業級開源充電樁平臺&#xff1a;完整代碼包含多租戶、硬件模擬器、多運營商、多小程序&#xff0c;汽車 電動自行車、云快充協議&#xff1b;——(慧哥)慧知開源充電樁平臺&#xff1b;https://liwenhui.blog.csdn.net/article/details/148242725?spm…

ONLYOFFICE 協作空間 企業版使用秘籍-8.使用虛擬數據房間,處理機密文檔更安全

在當今快節奏的社會中&#xff0c;信息已成為極其關鍵的資源&#xff0c;因此&#xff0c;保護敏感數據至關重要。ONLYOFFICE 協作空間中的虛擬數據房間&#xff08;VDR&#xff09;提供了一個安全便捷的工作空間&#xff0c;確保文檔受到嚴密保護的同時&#xff0c;也能實現輕…

系統架構設計師論文分享-論軟件架構復用

我的軟考歷程 摘要 2023年2月&#xff0c;我所在的公司通過了研發紗線MES系統的立項&#xff0c;該項目為國內紗線工廠提供SAAS服務&#xff0c;旨在提升紗線工廠的數字化和智能化水平。我在該項目中擔任架構設計師&#xff0c;負責該項目的架構設計工作。本文結合我在該項目…

虛擬主機與獨立服務器如何選擇

在搭建和維護網站時&#xff0c;選擇合適的服務器套餐至關重要。虛擬主機和獨立服務器是兩種常見的選擇&#xff0c;它們各有優缺點&#xff0c;適用于不同需求的用戶。本文將深入探討這兩種服務器類型的特點&#xff0c;以幫助您為您的網站選擇最合適的服務器解決方案。虛擬主…

NFC的安全技術體系

NFC&#xff08;近場通信&#xff09;技術因廣泛應用于移動支付、身份認證、門禁控制等敏感場景&#xff0c;其安全技術體系是保障用戶數據與交易安全的核心。該體系涵蓋數據傳輸安全、存儲安全、身份認證、防攻擊機制等多個維度&#xff0c;通過硬件隔離、加密算法、協議規范等…

Echarts3D柱狀圖-圓柱體-文字在柱體上垂直顯示的實現方法

全部代碼 <!DOCTYPE html> <html lang"en" style"height: 100%"> <head><meta charset"utf-8"><title>3D柱狀圖-圓柱體-文字豎排</title> </head> <body style"height: 100%; margin: 0"…

【算法訓練營Day08】字符串part2

文章目錄 反轉字符串里的單詞右旋字符串KMP算法雙指針法總結 反轉字符串里的單詞 題目鏈接&#xff1a;151. 反轉字符串中的單詞 雙指針法解題邏輯 head指針遍歷字符串遍歷到單詞首單詞&#xff0c;生成end指針移動到單詞尾部遇到完整單詞收集&#xff0c;壓入棧中head指針移動…