簡潔なプロキシ定義

特に、トランザクションプロキシを定義する場合、多くの同様のプロキシ定義になる可能性があります。親と子の Bean 定義を、内部の Bean 定義とともに使用すると、プロキシ定義がよりクリーンで簡潔になります。

まず、次のように、プロキシの親、テンプレート、Bean 定義を作成します。

<bean id="txProxyTemplate" abstract="true"
		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
	<property name="transactionManager" ref="transactionManager"/>
	<property name="transactionAttributes">
		<props>
			<prop key="*">PROPAGATION_REQUIRED</prop>
		</props>
	</property>
</bean>

これはインスタンス化されないため、実際には不完全な場合があります。次に、作成する必要がある各プロキシは子 Bean 定義であり、ターゲットはそれ自体で決して使用されないため、プロキシのターゲットを内部 Bean 定義としてラップします。次の例は、そのような子 Bean を示しています。

<bean id="myService" parent="txProxyTemplate">
	<property name="target">
		<bean class="org.springframework.samples.MyServiceImpl">
		</bean>
	</property>
</bean>

親テンプレートのプロパティをオーバーライドできます。次の例では、トランザクション伝播設定をオーバーライドします。

<bean id="mySpecialService" parent="txProxyTemplate">
	<property name="target">
		<bean class="org.springframework.samples.MySpecialServiceImpl">
		</bean>
	</property>
	<property name="transactionAttributes">
		<props>
			<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
			<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
			<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
			<prop key="store*">PROPAGATION_REQUIRED</prop>
		</props>
	</property>
</bean>

親 Bean の例では、前述のように abstract 属性を true に設定することで、親 Bean 定義を抽象として明示的にマークしたため、実際にはインスタンス化されないことに注意してください。アプリケーションコンテキスト (ただし、単純な Bean ファクトリではない) は、デフォルトですべてのシングルトンを事前にインスタンス化します。(少なくともシングルトン Bean については) テンプレートとしてのみ使用する予定の (親) Bean 定義があり、この定義でクラスが指定されている場合は、必ず abstract 属性を次のように設定する必要があることが重要です。true。それ以外の場合、アプリケーションコンテキストは実際に事前インスタンス化を試みます。