Author: 江南白衣
暂时使用所有Sample通用的声明式事务控制体系,可以考虑JDK5.0的Annotation方式,但声明式体系下get*,find*的基类预定义比较节约代码。
在声明式事务体系下,一般会定义一个baseTxService基类
<bean id="baseTxService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="proxyTargetClass" value="true"/>
<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="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
Tips1 ,因为我们没有创建Service接口,不能用基于接口的Proxy方式,必须使用cgilib来实现AOP事务管理,且cglib的方式比Proxy方式效率略高,因此需定义:
<property name="proxyTargetClass" value="true"/>
Tips2,当实际的Service子类需要事务控制的方法如--shipOrder,不为以上的get*,save*的命名方式时,需要在子类重新定义transactionAttributes。
从Spring 2.0M2开始,beans支持default-merge= "true" 的定义,子类不需要重新定义get*,save*。
可以在beans统一定义default-merge= true,也可以每个bean定义。
<beans default-merge="true">
<bean id="orderManager" parent="baseTxService">
<property name="target">
<bean class="org.springside.bookstore.service.OrderManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="shipOrder">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>