SPRING JDBC事务管理的三种配置方法

一.     一般的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="REQUIRED" />
            <!-- <tx:method name="*" propagation="true" />-->
        </tx:attributes>

    </tx:advice>

 

 

    <aop:config>
        <aop:pointcut id="allManagerMethod"
            expression="execution(* com.service.*.*(..))" />
        <aop:advisor advice-ref="txAdvice"
            pointcut-ref="allManagerMethod" />
    </aop:config>

解释一下(* com.evan.crm.service.*.*(..))中几个通配符的含义:

第一个 * —— 通配 任意返回值类型
第二个 * —— 通配 包com.evan.crm.service下的任意class
第三个 * —— 通配 包com.evan.crm.service下的任意class的任意方法
第四个 .. —— 通配 方法可以有0个或多个参数


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值