特别是当你对transactional代理下定义时,你可以用大量类似的代理定义来结束。父类和子类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>
上面的类并没有实例化,所以他并不是完整的。然后每个需要被创建的代理都是它的子类,它包装了定义为内部类的代理target,因为该target不会以他自己的方式使用。下面是一个子类的例子:
<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>
注意在父类的例子中,我们显示的设置abstract为true,如上面所示,所以他并没有被初始化,Application contexts(而不是简单的bean factories),会默认初始化所有的singletons。因此,如果你有一个父bean的定义,你打算只把他作为模板,并且他是一个类,那么你必须将他的abstract属性设置为true。否则application context 会尝试预先实例化他。