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());

}

}


 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
课堂签到管理系统可以使用Spring框架的MVC、IOC和AOP模块,以及Spring提供的JdbcTemplate进行数据访问。 1. MVC模式:MVC模式分为Model、View和Controller三个部分,分别代表应用程序的数据、视图和控制器。在课堂签到管理系统中,Model层可以使用JdbcTemplate访问数据库,View层可以使用JSP或Thymeleaf模板引擎渲染页面,Controller层则负责处理用户请求并调用Model和View层执行相应的操作。 2. IOC模式:IOC(Inversion of Control)即控制反转,是Spring框架的核心之一。通过IOC容器完成对象的创建和依赖注入,降低了组件之间的耦合性,使得系统更加灵活和可维护。在课堂签到管理系统中,可以通过IOC容器管理Controller和Service层的对象,实现对象的自动装配和依赖注入。 3. AOP模式:AOP(Aspect Oriented Programming)即面向切面编程,是Spring框架的另一个重要特性。通过AOP可以将通用的业务逻辑切面化,比如日志记录、权限校验、事务管理等。在课堂签到管理系统中,可以使用AOP实现日志记录和事务管理等功能。 4. JdbcTemplate:JdbcTemplate是Spring框架提供的一个JDBC模板类,可以简化JDBC代码的编写,并提供了一些便捷的方法和异常处理机制。在课堂签到管理系统中,可以使用JdbcTemplate访问数据库,并实现课程、学生、签到记录等数据的增删改查操作。 综上所述,课堂签到管理系统可以使用Spring框架的MVC、IOC和AOP模块,以及Spring提供的JdbcTemplate进行开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值