1. 程式人生 > >Spring(13)——PropertyPlaceholderConfigurer(二)之namespace

Spring(13)——PropertyPlaceholderConfigurer(二)之namespace

13.6 指定載入順序

有的時候我們可能需要或者是希望定義多個PropertyPlaceholderConfigurer,這個時候我們可以通過setOrder()方法來指定PropertyPlaceholderConfigurer的處理順序,值越小的越先處理。這樣就有兩個問題要考慮,當一個屬性變數可以被多個PropertyPlaceholderConfigurer進行替換時,先處理的將優先替換,替換後對於後處理的PropertyPlaceholderConfigurer來說對應的變數已經不存在了也就不能再進行替換了。第二個需要考慮的問題是當某些屬性變數只能由某些個PropertyPlaceholderConfigurer進行替換時,使用預設設定的話在其前處理的PropertyPlaceholderConfigurer遇到不能替換的屬性變數時將丟擲異常,所以我們需要指定定義在前面的PropertyPlaceholderConfigurer忽略屬性變數不能被解析的情況。

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
		<property name="location" value="classpath:t1.properties"/> 
		<!-- 忽略變數不能被解析的情況 -->
		<property name="ignoreUnresolvablePlaceholders" value="true"/>
		<!-- 指定處理順序 -->
		<property
name="order" value="1"/> </bean> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:t2.properties"/> <!-- 忽略變數不能被解析的情況 --> <property name="ignoreUnresolvablePlaceholders" value="true"
/> <!-- 指定處理順序 --> <property name="order" value="2"/> </bean>

13.7 使用名稱空間進行定義

通過在Spring的配置檔案中引入context名稱空間,然後通過該名稱空間的property-placeholder元素定義預設就可以在對應的bean容器中生成一個對應PropertySourcesPlaceholderConfigurer型別的對應的bean,在Spring3.1以前使用<context:property-placeholder/>將生成一個PropertyPlaceholderConfigurer型別的bean。可以通過該元素的location屬性來指定對應的外部屬性檔案的位置,多個檔案之間以逗號分隔。可以通過properties-ref屬性來指定需要關聯的內部屬性定義對應的bean。可以通過local-override屬性來指定當內部屬性定義與外部屬性檔案定義存在相同的屬性時是否內部屬性定義需要覆蓋外部屬性檔案定義的屬性,預設為false。

可以通過system-properties-mode屬性來指定針對系統屬性的策略,針對不同的策略Spring底層會生成不同型別的bean進行處理,當指定其值為“ENVIRONMENT”時將生成PropertySourcesPlaceholderConfigurer型別的bean來進行對應變數的替換,其它三種類型將生成PropertyPlaceholderConfigurer型別的bean來進行對應變數的替換。

  • ENVIRONMENT表示將使用PropertySourcesPlaceholderConfigurer來處理對應的變數替換,其會根據當前的Spring Environment及一系列的PropertySources來替換對應的變數,這是預設值。這些PropertySources包括該通過該元素的location屬性指定的外部屬性檔案和通過properties-ref屬性指定的內部屬性定義對應bean定義的屬性。
  • NEVER表示從不使用系統屬性來替換對應的變數。
  • FALLBACK表示只有在沒有屬性匹配當前變數的情況下才嘗試使用系統屬性來進行替換。
  • OVERRIDE表示將優先使用系統屬性來替換對應的變數,即只有在系統屬性不能替換對應變數時才使用外部檔案定義的屬性或是內部屬性進行替換。

當location和properties-ref都沒有進行指定時即表示只通過系統屬性來進行變數的替換。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
	
	<context:property-placeholder
	location="classpath:t1.properties,classpath:t2.properties"
	properties-ref="innerProps" system-properties-mode="ENVIRONMENT" />
	
	<bean id="innerProps" class="java.util.Properties">
		<constructor-arg>
			<props>
				<prop key="p1">v1</prop>
				<prop key="p2">v2</prop>
			</props>
		</constructor-arg>
	</bean>

</beans>

還可以通過ignore-resource-not-found屬性來指定是否忽略對應屬性檔案找不到的問題,預設為false,即會丟擲異常。通過ignore-unresolvable屬性指定是否忽略屬性變數不能解析或者說是不能被替換的情況,預設為false,即不忽略,遇到不能解析的屬性變數時將丟擲異常。

	<context:property-placeholder
		location="classpath:t1.properties,classpath:t2.properties"
		properties-ref="innerProps" system-properties-mode="ENVIRONMENT"
		ignore-resource-not-found="false" ignore-unresolvable="false" />

還可以通過order屬性指定當前BeanFactoryPostProcessor的載入順序。

通過上面的介紹我們知道PropertySourcesPlaceholderConfigurer和PropertyPlaceholderConfigurer的作用其實是類似的,它們有著共同的父類PlaceholderConfigurerSupport。我們也可以單獨的在Spring的配置檔案中定義一個PropertySourcesPlaceholderConfigurer型別的bean用以替換對應的變數。與PropertyPlaceholderConfigurer相比,其除了不能指定systemPropertiesMode屬性外,其它基本都和PropertyPlaceholderConfigurer是一樣的。此外,如同它們的名稱一樣,PropertyPlaceholderConfigurer內部使用的是java.util.Properties作為屬性資源的來源,而PropertySourcesPlaceholderConfigurer內部則是使用的org.springframework.core.env.PropertySources作為屬性資源的來源。另外,PropertySourcesPlaceholderConfigurer還可以使用當前Spring的Environment物件getProperty()方法來獲取屬性變數對應的值以進行替換。更多資訊請參看Spring的API文件。

(注:本文是基於Spring4.1.0所寫)

相關推薦

Spring13——PropertyPlaceholderConfigurernamespace

13.6 指定載入順序有的時候我們可能需要或者是希望定義多個PropertyPlaceholderConfigurer,這個時候我們可以通過setOrder()方法來指定PropertyPlaceholderConfigurer的處理順序,值越小的越先處理。這樣就有兩個問題要

TypeScript入門知識五面向對象特性

開發 func var ons inter 約定 pub 資源 new 1.泛型(generic) 參數化的類型,一般用來限制集合的內容 class Person {   constructor(private name: string) {

當asp.net core偶遇docker一模型驗證和Rabbitmq

上一篇我們說到構建了一個Rabbitmq容器 現在我們說說如何在一個悄悄傳輸訊息到佇列 我們現在設計一個Rabbitmq傳送訊息部分的模組 先設計一個遠端傳送的介面 public interface IRemoteSend { void Send<TEnti

小程式篇:伺服器接收小程式圖片

小程式圖片上傳,在伺服器上接收小程式上傳的圖片 前面一篇介紹了本地搭建小程式測試伺服器,但是有一定侷限性:不能上傳圖片。因為小程式上傳圖片需要驗證公用ssl證書,使用一些不正規的免費證書不能完成上傳。所以我在阿里雲上申請了一個用來測試,方法:linux伺服器配置https 。當完成這

【C++】名字空間解決名字衝突問題

目錄 名字空間定義 名字空間使用 頭源分離 同一名稱空間在多個檔案中  一般自己是不會使用的,但一些大型的庫可能用到,比如名稱空間std. 名字空間定義 解決名字衝突問題的究極解決方法:namespace(名字空間) 語法為: name

python進階資料分析numpy庫

 2、ndarray陣列的切片:        (1)陣列切片的基本知識             各個維度上單獨切片,用 “,” 隔開,用 “:”表示該維度所有的值。  

套接字程式設計的基本模式網路程式設計Linux_C -> 筆記

套接字程式設計的基本模式 客戶端/伺服器   客戶端/伺服器模式就是基本的網路程式設計模式,簡稱C/S(即Client/Server)模式。需要注意的是這裡的客戶端、伺服器指的是軟體層面的意思而不是硬體,即客戶端、伺服器是分別執行在兩臺電腦上的兩個軟體。   

SQL Server調優系列基礎篇並行運算總結篇

前言 上一篇文章我們介紹了檢視查詢計劃的並行執行方式。 本篇我們接著分析SQL Server的並行運算。 閒言少敘,直接進入本篇的正題。 技術準備 同前幾篇一樣,基於SQL Server2008R2版本,利用微軟的一個更簡潔的案例庫(Northwind)進行解析。 內容 文章開始前,我們先來回顧

TCP/IP的特性流量控制&阻塞控制

TCP流量控制之滑動視窗協議:     TCP協議中,傳送方和接收方均維護了一份視窗,視窗的大小就是TCP可以傳送的資料幀數,在傳送端,只有在傳送視窗內的資料才允許被髮送到接收端,而在接收端,也只有落到接收視窗的資料才允許被接收。這樣通過不斷滑動視窗實現資料的不斷髮送,也通過控

017、RUN、CMD、ENTRYPOINT 2019-01-08 周

true entry bold reat htm bdd 鏡像 ram 容器 參考https://www.cnblogs.com/CloudMan6/p/6875834.html RUN CMD ENTRYPOINT 這三個Dockerfile指令看上去很類似,很容

六類運算子+鍵盤錄入+流程控制語句順序結構與選擇結構中的if與switch語句部分+練習+面試題java基礎語法篇

一。運算子(對常量和變數進行操作的符號)1.1算術運算子嘗試敲出以下程式碼,看看輸出的結果分別是什麼?相信通過敲出上面程式碼並執行,已經看出 /運算子是取商,而且商是向下取整,%則是取餘數沒理解的話做下下面兩個題試試(答案在下面,先自己計算出答案再敲出來驗證) 第一題答案 9

什麼是Hadoop大資料基礎系列

MapReduce 是適合海量資料處理的程式設計模型。Hadoop是能夠執行在使用各種語言編寫的MapReduce程式: Java, Ruby, Python, and C++. MapReduce程式是平行性的,因此可使用多臺機器叢集執行大規模的資料分析非常有用的。Ma

Android專案中遇到的坑Android圓角圓形圖

接著上一篇的問題來研究研究: **問題來了:效果是有了,但有發現麼?我設定的scaleType只有fitxy 是有效果的,其他的都沒有效果了。設定為其他的scaleType都變成matrix那種效果了,也就是圖片預設從控制元件的左上角開始擺放。** 我們

springmvc跨域+token驗證app後臺框架搭建

這是app後臺框架搭建的第二課,主要針對app應用是跨域的運用,講解怎麼配置跨域服務;其次講解怎麼進行token驗證,通過攔截器設定token驗證和把token設定到http報文中。主要有如下:      1)app後臺跨域設定     2)攔截器中設定http報文heade

Tomcat總體架構Tomcat原始碼解析系列

         Tomcat即是一個HTTP伺服器,也是一個servlet容器,主要目的就是包裝servlet,並對請求響應相應的servlet,純servlet的web應用似乎很好理解Tomcat是如何裝載servlet的,但,當使用一些MVC框架時,如spring M

062、如何使用flannel host-gw backend2019-04-02 周

12px server kill pem 容器 sin 修改 with lse 參考https://www.cnblogs.com/CloudMan6/p/7457653.html flannel 支持多種backend,前面學習的是 vxlan backend ,

學習LCA 最近公共祖先·

dex node int 離線 i++ cout com ans pan http://hihocoder.com/problemset/problem/1067 tangin+離線 #include<bits/stdc++.h> using name

跟著剛哥學習Spring框架--Spring容器

contain 系統 框架 blog 關系 文件路徑 mage 文件系統 技術分享 Spring容器 啟動Spring容器(實例化容器)   -- IOC容器讀取Bean配置創建Bean實例之前,必須對它進行實例化(加載啟動),這樣才可以從容器中獲取Bean的實例並使用

spring

per 取出 keys str ans 繼承 分享 sta void 盡量使用 scope="singleton" ,不要使用prototype,因為對性能的影響較大 給集合類型註入值 Java中主要的集合有:map set list 數組 department類

spring 加密 Druid 連接池—— 加密 url,driverClassName,用戶名,密碼

stack urn b- ride style alibaba row com logs why? 連接信息暴露在配置文件中有風險 how? 一、準備加密後連接信息 使用Druid自帶工具類ConfigTools加密連接信息 import com.alibaba.dr