Spring的Aop事务管理

1. pom文件中添加相关依赖

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-aop</artifactId>

</dependency>

2. 配置

package com.example.tmshop.tm.common;



import org.aspectj.lang.annotation.Aspect;

import org.springframework.aop.Advisor;

import org.springframework.aop.aspectj.AspectJExpressionPointcut;

import org.springframework.aop.support.DefaultPointcutAdvisor;

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 javax.annotation.Resource;

import java.util.Collections;

import java.util.HashMap;

import java.util.Map;



@Aspect

@Configuration

public class TransactionAdviceConfig {



    private final static int METHOD_TIME_OUT = 5000;



    //这里的第一个*代表的是任意返回值

    //第二个代表任意类

    //第三个代表任意方法

    //..代表任意参数

    /**

     * 配置切入点表达式

     */

    private static final String POINTCUT_EXPRESSION = "execution(* com.example.tmshop.tm.service.*.*(..))";

    /**

     * 事务管理器

     */

    @Resource

    private PlatformTransactionManager transactionManager;





    @Bean

    public TransactionInterceptor txAdvice() {

        /*事务管理规则,声明具备事务管理的方法名**/

        NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();

        /*只读事务,不做更新操作*/

        RuleBasedTransactionAttribute readOnly = new RuleBasedTransactionAttribute();

        readOnly.setReadOnly(true);

        //永远以非事务的方式执行,如果当前存在事务则将事务挂起

        readOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);

        /*当前存在事务就使用当前事务,当前不存在事务就创建一个新的事务*/

        RuleBasedTransactionAttribute required = new RuleBasedTransactionAttribute();

        /*抛出异常后执行切点回滚,这边你可以更换异常的类型*/

        //不论什么异常都会回滚

        //因为setRollbackRules会给rollbackRules赋值,但是

        //rollbackRules是一个集合,泛型是RollbackRuleAttribute

        //RollbackRuleAttribute里面默认创建了一个public static final的异常,RunTimeException

        //也就意味着所有的运行时异常都会被识别

        required.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));

        /*PROPAGATION_REQUIRED:事务隔离性为1,若当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值*/

        required.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

        /*设置事务失效时间,如果超过5秒,则回滚事务*/

        required.setTimeout(METHOD_TIME_OUT);

        Map<String, TransactionAttribute> attributesMap = new HashMap<>(30);

        //设置增删改上传等使用事务

        attributesMap.put("save*", required);

        attributesMap.put("remove*", required);

        attributesMap.put("update*", required);

        attributesMap.put("batch*", required);

        attributesMap.put("clear*", required);

        attributesMap.put("add*", required);

        attributesMap.put("append*", required);

        attributesMap.put("modify*", required);

        attributesMap.put("edit*", required);

        attributesMap.put("insert*", required);

        attributesMap.put("delete*", required);

        attributesMap.put("do*", required);

        attributesMap.put("create*", required);

        attributesMap.put("import*", required);

        //查询开启只读

        attributesMap.put("select*", readOnly);

        attributesMap.put("get*", readOnly);

        attributesMap.put("valid*", readOnly);

        attributesMap.put("list*", readOnly);

        attributesMap.put("count*", readOnly);

        attributesMap.put("find*", readOnly);

        attributesMap.put("load*", readOnly);

        attributesMap.put("search*", readOnly);

        source.setNameMap(attributesMap);

        return new TransactionInterceptor(transactionManager, source);

    }

    /**

     * 设置切面=切点pointcut+通知TxAdvice

     */

    @Bean

    public Advisor txAdviceAdvisor() {

        /* 声明切点的面:切面就是通知和切入点的结合。通知和切入点共同定义了关于切面的全部内容——它的功能、在何时和何地完成其功能*/

        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();

        /*声明和设置需要拦截的方法,用切点语言描写*/

        pointcut.setExpression(POINTCUT_EXPRESSION);

        /*设置切面=切点pointcut+通知TxAdvice*/

        return new DefaultPointcutAdvisor(pointcut, txAdvice());

    }

}
    /*声明和设置需要拦截的方法,用切点语言描写*/

    pointcut.setExpression(POINTCUT_EXPRESSION);

    /*设置切面=切点pointcut+通知TxAdvice*/

    return new DefaultPointcutAdvisor(pointcut, txAdvice());

}

}


 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值