日期:2014-05-16 浏览次数:20576 次
一.???? 一般的JDBC事务,通常可以这样处理:
<bean id="txProxyTemplate" abstract="true"??? 
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">??? 
??? <property name="transactionManager">?? 
??????? <ref bean="transactionManager"/>?? 
??? </property>??? 
??? <property name="transactionAttributes">??? 
??????? <props>?? 
??????????? <prop key="find*">PROPAGATION_REQUIRED, readOnly</prop>??? 
??????????? <prop key="*">PROPAGATION_REQUIRED</prop>??? 
??????? </props>??? 
??? </property>??? 
</bean>??? 
<bean id="userManager" parent="txProxyTemplate">??? 
??? <property name="target">??? 
??????? <bean class="some.package.UserManagerImpl">??? 
??????????? <property name="userDAO"><ref bean="userDAO"/></property>??? 
??????? </bean>??? 
??? </property>??? 
</bean>???
以后,如果增加新的Service/Manager,则XML配置的增量是这一段: 
<bean id="someOtherManager" parent="txProxyTemplate" >??? 
??? <property name="target">??? 
??????? <bean class="some.package.someOtherManagerImpl">??? 
??????? </bean>??? 
??? </property>??? 
</bean>
?
?
?
?
二.每次都要添加这段重复的代码,有点繁琐,可以使用TransactionInterceptor进行一点简化:
?
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
?? <property name="dataSource">
??? <ref local="dataSource" />
?? </property>
</bean>
?
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
?? <property name="transactionManager" ref="transactionManager"/>
?? <property name="transactionAttributes">
??? <props>
???? <prop key="*">PROPAGATION_REQUIRED</prop>
???? <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
???? <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
???? <prop key="request*">PROPAGATION_REQUIRED,readOnly</prop>
??? </props>
?? </property>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
?? <property name="beanNames">
??? <value>*Service</value>
?? </property>
?? <property name="interceptorNames">
??? <list>
???? <value>transactionInterceptor</value>
??? </list>
?? </property>
</bean>
<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
?? <property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>
关键在上面的高亮处,只要类的名字满足*Service的规则,那么它就会对这个类进行事务管理!
如此,我们无需再添加累赘的代码,只要名字满足规则就ok了!
?
?
?
三.第三种 tx:advice 和 aop:config 简化配置事务:
??? <tx:advice id="txAdvice" transaction-manager="transactionManager">
??????? <tx:attributes>
??????????? <tx:method name="add*" propagation="REQUIRED" />
??????????? <tx:method name="delete*" propagation="REQUIRED" />
??????????? <tx:method name="update*" propagation="REQUIRED" />
??????????? <tx:method name="add*" propagation="REQUIRE