Springboot全局事務配置:XML配置和java類配置

第一種方式:XML配置;

首先要在啓動類配置引入註解:

 然後配置XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">
    <bean id="txManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" ></property>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="mod*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="up*" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
            <tx:method name="set*" propagation="REQUIRED"/>
            <tx:method name="change*" propagation="REQUIRED"/>
            <tx:method name="logout*" propagation="REQUIRED"/>
            <tx:method name="login*" propagation="REQUIRED"/>
            <tx:method name="check*" propagation="REQUIRED"/>
            <tx:method name="tiJiao*" propagation="REQUIRED"/>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="query*" read-only="true"/>
            <tx:method name="init*" read-only="true"/>
            <tx:method name="timing*" propagation="REQUIRED"/>
            <tx:method name="execute*" propagation="REQUIRED"/>
            <tx:method name="execute*" propagation="REQUIRED"/>
            <tx:method name="send*" propagation="REQUIRED"/>
            <tx:method name="batch*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <!-- 切入點 -->
        <aop:pointcut id="newServicesPointcut"
                      expression="execution(* com.esl.ce.*.*.service..*.*(..))  or execution (* com.esl.ce.*.*.*.service..*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="newServicesPointcut"/>
    </aop:config>
</beans>

 注:切入點一定要和自己項目中的目錄結構對應,execution(* com.esl.ce.*.*.service..*.*(..)),.*代表一層目錄。

 

第二種方式:java類配置事務

package com.esl.ce.web.common.util;

import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.*;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * springboot 之 註解式聲明事務,使用聲明式事務配置
 * @author Administrator
 */
@Configuration
public class ApplicationContextTransactional {

    //事務方法超時時間設置
    private static final int TX_METHOD_TIMEOUT=10;

    //AOP切面的切點表達式
    private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.esl.ce.*.*.service..*.*(..))  or execution (* com.esl.ce.*.*.*.service..*.*(..))";

    //注入事務管理器
    @Autowired
    private PlatformTransactionManager transactionManager;

    /**
     * 增強(事務)的屬性的配置
     *       isolation:DEFAULT  :事務的隔離級別.
     *       propagation              :事務的傳播行爲.
     *       read-only                        :false.不是隻讀
     *       timeout                          :-1
     *       no-rollback-for         :發生哪些異常不回滾
     *       rollback-for                    :發生哪些異常回滾事務
     * @return
     */
    @Bean
    public TransactionInterceptor txAdvice() {
           /*增強(事務)的屬性的配置
            * <tx:attributes>
            * */
        NameMatchTransactionAttributeSource txAttributeS = new NameMatchTransactionAttributeSource();
           /*propagation="REQUIRED" , timeout=5 ;rollback-for=".. , .."配置*/
        RuleBasedTransactionAttribute requiredAttr = new RuleBasedTransactionAttribute();
        requiredAttr.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        requiredAttr.setTimeout(TX_METHOD_TIMEOUT);
        requiredAttr.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
           /*propagation="SUPPORTS" , readOnly="true"配置*/
        RuleBasedTransactionAttribute supportsAttr = new RuleBasedTransactionAttribute();
        supportsAttr.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);
        supportsAttr.setReadOnly(true);
           /*
            注意:方法名稱來自類匹配的到方法【save*, “*”表示匹配任意個字符】
             <tx:method .../>
            */
        Map<String , TransactionAttribute> txMethod = new HashMap<String , TransactionAttribute>();
        txMethod.put("add*" , requiredAttr);
        txMethod.put("save*" , requiredAttr);
        txMethod.put("del*" , requiredAttr);
        txMethod.put("mod*" , requiredAttr);
        txMethod.put("update*" , requiredAttr);
        txMethod.put("up*" , requiredAttr);
        txMethod.put("remove*" , requiredAttr);
        txMethod.put("set*" , requiredAttr);
        txMethod.put("change*" , requiredAttr);
        txMethod.put("logout*" , requiredAttr);
        txMethod.put("login*" , requiredAttr);
        txMethod.put("check*" , requiredAttr);
        txMethod.put("tiJiao*" , requiredAttr);
        txMethod.put("get*" , supportsAttr);
        txMethod.put("find*" , supportsAttr);
        txMethod.put("query*" , supportsAttr);
        txMethod.put("init*" , supportsAttr);
        txMethod.put("timing*" , requiredAttr);
        txMethod.put("execute*" , requiredAttr);
        txMethod.put("execute*" , requiredAttr);
        txMethod.put("send*" , requiredAttr);
        txMethod.put("batch*" , requiredAttr);
        txAttributeS.setNameMap(txMethod);
        TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager , txAttributeS);
        return txAdvice;
    }

    /**
     * AOP配置定義切面和切點的信息
     * @return
     */
    @Bean
    public Advisor txAdviceAdvisor() {
        AspectJExpressionPointcut pointcut= new AspectJExpressionPointcut();
        pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
        return new DefaultPointcutAdvisor(pointcut , txAdvice());
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章