Spring(12)——ProptyPlace HolderConfigrer


もっと読む
12 PropertyPlace HolderConfigrer
PropertyPlaceholderConfigrerは、BenFactoryPostProcessorインターフェースの実現であり、beanを定義する際にbeanのいくつかの属性を変数形式と定義し、PropertyPlaceholderConfigrerがこれらのbeanを実用化する前に外部で定義された属性ファイルや内部で定義された属性などを用いてこれらの変数を対応する属性値に置き換えることができます.
よく見かけるかもしれませんが、このような定義を使うと、context:property-placceholderはSpring context名前空間に内蔵されているラベルです.このラベルSpringの内部に対してPropertyPlace holderConfigrer対応のbeanが作られます.ここでlocation属性はロードする外部属性ファイルに対応する経路を表しています.
<context:property-placeholder location="/WEB-INF/config/jdbc.properties" />

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
	destroy-method="close">
	<property name="driverClassName" value="${jdbc.driverClassName}" />
	<property name="url" value="${jdbc.url}" />
	<property name="username" value="${jdbc.username}" />
	<property name="password" value="${jdbc.password}" />
bean>
上記の構成では、idがdataSourceのbeanに対応する属性値を、私たちはすべて変数で表しています.私たちが定義したPropertyPlaceholderConfigrerは、すべてのbeanを初期化する前に、私たちが定義した外部属性ファイルjdbc.propertiesを利用してこれらの変数を置換しますので、対応する値は直接jdbc.propertiesファイルに定義できます.
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=crm
jdbc.password=crm
私たちはbean容器の中で直接にPropertyPlaceholderConfigrerタイプのbeanを定義して、すべてのbean定義が完了したら、その利用可能な属性を利用してbean定義で使用する変数を置換することができます.PropertyPlaceholderConfigrerとProptySources Place holderConfigrerは、いずれも抽象的なPlaceholder Configrer Surpportから継承されており、それらが使用する変数の置き換えの主論理は、プラクティブ・コンフィグレートから来ています.
12.1代替変数として使用できる属性
12.1.1外部属性ファイル
PropertyPlace HolderConfigrerは、変数を置き換えるためによく使用される属性は、外部属性ファイルから定義され、set Location()方法またはset Locations()方法によって注入され、set Location()方法は外部属性ファイルを注入するために使用されるが、set Locations()は1つ以上の外部属性ファイルを注入するために使用される.注入時にはいずれもResourceとして注入されます.
set Location()によって単一の属性ファイルを注入します.
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

		<property name="location" value="classpath:t1.properties"/>
	bean>
set Locations()によって1つ以上の属性ファイルを注入します.
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		
		<property name="locations">
			<array>
				<value>classpath:t1.propertiesvalue>
				<value>classpath:t2.propertiesvalue>
			array>
		property>
	bean>
12.1.2内部属性
内部属性は、set Properties()またはset PropertiesAray()方法によって定義され、前者はPropertiesオブジェクトを受信し、後者はProperties配列を受信する.
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		
		<property name="properties">
			<props>
				<prop key="p1">v1prop>
				<prop key="p2">v2prop>
			props>
		property>
	bean>
12.1.3環境変数、システム変数
環境変数、システム変数は、直接ProptyPlaceholderConfigrerによって属性ソースとして、bean定義で使用される変数を置き換えることができます.JAVA_のようですホーム、user、dirなど.環境変数はSystem.getensvによって取得され、システム変数は指定されたJVMパラメータを表し、System.get Property(name)によって取得できる.
12.1.4属性ソースの優先度
変数の属性ソースを置き換えることができる以上、両者が衝突した場合にはどのような戦略が取られますか?外部属性ファイルの定義と内部属性の定義はAクラス、環境変数、システム変数をBクラスと定義します.Aクラスでは、外部属性ファイルの定義が内部属性の定義と競合している場合、同じ属性が存在する場合、デフォルトでは外部属性ファイルで定義されている属性値が内部propertiesで定義されています.内部属性定義が外部属性ファイルをカバーして定義される属性を設定する必要があるなら、set Local Override()方法により対応するlocal Overrideをtrueと指定し、内部属性を設定して外部属性ファイル定義をカバーする属性を定義する目的があります.
	
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
		p:localOverride="true">
		
	bean>
B類についてA類と同じ属性定義がある場合、どのようなポリシーを取るかは一つのパラメータによって決められます.setSystem PropertiesModeにより対応する値を指定することができ、set System ProptiesModeNameにより対応するポリシー名を指定することもできます.オプションの値とオプションの名前は以下の通りです.
SYSTEM_PROPRERTIES_MODE_NEVER:対応値は0です.システム属性を使用しないで置換することを表します.SYSTEM_PROPRERTIES_MODE_FALLBACK:対応する値は1で、これはデフォルトのオプションです.は、Aクラスの属性に変数に対応する属性が見つからない場合のみ、システム属性を使って置き換えてみます.SYSTEM_PROPRERTIES_MODE_OVERRIDE:対応する値は2です.システム属性に変数に対応する属性がある場合、システム属性の値を使用します.
	
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
		p:systemPropertiesMode="2">
		<property name="properties">
			<props>
				<prop key="java.tempdir">abcprop>
			props>
		property>
	bean>
12.2変数の定義
変数のデフォルトは「$varName」という形で定義されています.つまり「\」で始まり、「}」で終了し、中間対応変数名、PropertyPlaceholderConfigurerデフォルトはこのような形の定義を置換が必要な変数定義とします.中間対応は変数名です.基本的にidとname以外は、beanで定義されている他の内容は、class、parentなどの変数で定義されています.
	
	<bean id="hello" class="com.app.Hello" p:userDir="${user.dir}"/>	
以上は、変数user.dirとして属性userDirを定義する例であり、bean beanが実装される前に定義されたPropertyPlaceholderConfigrerによってその変数を置き換える.変数を「$varName」と定義したくない場合は、set PlaceholderProfix()方法で変数に対応するプレフィックスを指定してもいいです.デフォルトは「${」です.set PlaceholderSuffix()方法で対応するサフィックスを指定してもいいです.デフォルトは「%」です.したがって、私たちが私たちの変数を「@varName」と定義したいなら、次のように定義できます.
	
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
		p:placeholderPrefix="@{" p:placeholderSuffix="}" />
対応する変数は次のように定義されます.
	
	<bean id="hello" class="com.app.Hello" p:userDir="@{user.dir}" />
beans>
12.3デフォルトを指定する
属性変数を定義する際に、対応するデフォルト値を指定することもできます.属性変数のデフォルト値が指定されている場合、現在の属性変数を置き換えるための属性が見つからない場合は、定義されたデフォルト値を使用して、現在の属性変数を置換します.属性変数を定義するときは変数名の直後にデフォルト値を指定できますが、デフォルト値と変数名の間はセミコロンで区切られています.
	
	<bean id="hello" class="com.app.Hello" p:maxVal="${maxVal:100}" />
属性変数名とデフォルト値のセパレータはデフォルトではセミコロン":"であり、ユーザーが必要であればProptyPlaceholderConfigrerのsetValue Separator()で変更することもできます.
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
		
		<property name="valueSeparator" value="::"/>
	bean>
12.4ファイルを無視して見つかりませんでした.
デフォルトでは、set Location()またはset Locations()メソッドにより外部属性ファイルを指定した場合、対応するファイルが存在しない場合には、異常情報を投げます.setIgnoreResource NotFound()により、ファイルが見当たらない場合を無視するかどうか設定できます.ユーザーが対応するエラーを無視したいなら、対応する値をnullに設定することができます.
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
		<property name="location" value="classpath:t12.properties"/> 
		
		<property name="ignoreResourceNotFound" value="true"/>
	bean>
12.5変数を無視すると解析できません.
デフォルトでは、PropertyPlace HolderConfigrerは、bean定義のすべての$varName形式の定義を属性変数として定義して置き換えます.bean定義には、形式が$varNameである変数が定義されていますが、ProptyPlaceholderConfigrerによって定義された外部属性ファイルに含まれる属性または内部属性定義の属性または環境変数に置き換えられない場合には、異常情報をスローします.対応する属性変数が解析できない時に異常情報を投げないことを望むなら、setIgnoreUnirevable Placeholders()メソッドでInoreUnireUnirevable Placeholdersの値をtrueと指定することができ、これで変数を無視して解析できない場合があります.
 
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
		<property name="location" value="classpath:t12.properties"/> 
		
		<property name="ignoreResourceNotFound" value="true"/>
		
		<property name="ignoreUnresolvablePlaceholders" value="true"/>
	bean>
 
 
本論文の転送先:https://elim.iteye.com/blog/2387138