SpringBoot 事务管理+AOP

一、事务是什么?在MySQL中是怎么去开启,提交,回滚事务的。

1.事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

2.事务操作:

  • 开启事务:begin /start transaction ;   一组操作开始前,开启事务
  • 提交事务:   commit;   全部成功后提交事务
  • 回滚事务:   rollback;   中间有任何一个子操作出现异常,回滚事务

二、在Spring中怎么管理事务,用什么注解,在那个层次进行使用可以有效管理事务

1、注解:@Transactional

2、位置:业务(service)层的方法上、类上、接口上

3、作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务

三、事务管理时规则:如果方法能够正常执行完自动提交事务,如果出现异常自动回滚事物。事务默认识别的异常是运行时异常,如果想要识别到编译时异常从而实现回滚,该怎么操作?

1). 方案一

而这样配置的话,使用比较麻烦,故而在实际开发中一般会进行异常转换

2). 方案二

如果业务代码有编译时异常,则将其转换为运行时异常,再抛出

 这样即使用方便,又不至于事务失效。当然,如果全部抛出RuntimeException 不利于调错,故而可以自定义运行时异常,并抛出自定义异常。

 

四、事务的传播方式有哪些,含义是怎样?

propagation

1、事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

2、由于没有配置事务传播行为,则默认事务传播行为 为 REQUIRED, 则表示  EmpServiceImpl.deleteByDeptId(),使用 DeptServiceImpl.delete() 刚才开启的事务,也就意味着这两个方法公用同一个事务,可以对其进行 统一提交和回滚操作。

3、使用 propagation 属性可以配置事务传播行为

属性值

含义

说明

REQUIRE

【默认值】需要事务,有则加入,无则创建新事务

-

REQUIRES_NEW

需要新事务,无论有无,总是创建新事务

-

SUPPORTS

支持事务,有则加入,无则在独立的连接中运行 SQL

结合 Hibernate、JPA  时有用,配在查询方法上

NOT_SUPPORTED

不支持事务,不加入,在独立的连接中运行 SQL

-

MANDATORY

必须有事务,否则抛异常

-

NEVER

必须没事务,否则抛异常

-

NESTED

嵌套事务

仅对 DataSourceTransactionManager  有效

五、AOP叫做什么,有什么作用?举一个5岁孩子就能理解的例子?

1、AOP:Aspect Oriented Programming(面向切面编程)

2、作用:它的核心思想是将重复的逻辑剥离出来,在不修改原始逻辑的基础上对原始功能进行增强。

  • 优势:无侵入、减少重复代码、提高开发效率、维护方便
  • 我们可以通过AOP来完成上述代码的优化

3、例子:

假设有一个小孩每天都要去学校上课。在这个过程中,我们可能会想记录下他的行为,比如他几点钟起床,吃了什么早餐,坐了哪辆校车等等。使用AOP的思想,我们可以将这些记录行为从主要的学习过程中提取出来,作为一个独立的关注点。

那么,这个关注点可以是一个日志记录器,记录下每天学生的行为。每当这个小孩开始上学时,日志记录器就会被触发,记录下起床的时间、早餐的内容等等。这样,我们可以将其他核心逻辑(如学习)与记录行为分离开来,使得代码更加清晰和可维护。

六、如果要完成一个AOP的入门案例,需要有哪些步骤?

1). pom.xml 引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2). 定义类抽取公共代码(执行耗时统计操作)

@Slf4j
public class TimeAspect {
	
    public void recordTime() throws Throwable {
        long begin = System.currentTimeMillis();
        
        //调用原始操作
        
        
        long end = System.currentTimeMillis();
        log.info("执行耗时 : {} ms", (end-begin));
    }
	
}

3). 标识当前类是一个AOP类,并被Spring容器管理

@Component
@Aspect
@Slf4j
public class TimeAspect {
	
    public void recordTime() throws Throwable {
        long begin = System.currentTimeMillis();
        
        //调用原始操作
        
        
        long end = System.currentTimeMillis();
        log.info("执行耗时 : {} ms", (end-begin));
    }
	
}

@Aspect:标识当前类是一个AOP类

@Component:声明该类是spring的IOC容器中的bean对象

4). 配置公共代码作用于哪些目标方法

@Component
@Aspect
@Slf4j
public class TimeAspect {
	
    @Around("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void recordTime() throws Throwable {
        long begin = System.currentTimeMillis();
        
        //调用原始操作
        
        
        long end = System.currentTimeMillis();
        log.info("执行耗时 : {} ms", (end-begin));
    }
	
}

5). 执行目标方法

@Component
@Aspect
@Slf4j
public class TimeAspect {
	
    @Around("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long begin = System.currentTimeMillis();
        //调用原始操作
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();
        log.info("执行耗时 : {} ms", (end-begin));
        return result;
    }
    
}

6). 测试运行

七、AOP的概念理解:连接点,通知,切入点,切面 ?

  • 连接点:JoinPoint,可以被AOP控制的方法执行(包含方法信息)
  • 通知:Advice ,重复逻辑代码
  • 切入点:PointCut ,匹配连接点的条件
  • 切面:Aspect,通知+切点

八、通知有哪些类型?

  • @Around:此注解标注的通知方法在目标方法前、后都被执行
  • @Before:此注解标注的通知方法在目标方法前被执行
  • @After :此注解标注的通知方法在目标方法后被执行,无论是否有异常
  • @AfterReturning : 此注解标注的通知方法在目标方法后被执行,有异常不会执行
  • @AfterThrowing : 此注解标注的通知方法发生异常后执行

@Around 需要自己调用 ProceedingJoinPoint.proceed() 来让目标方法执行,其他通知不需要考虑目标方法执行

九、如果有不同切面的通知,增强相同的方法,执行顺序是怎样的?

当有多个切面的切点都匹配目标时,多个通知方法都会被执行。之前介绍的 pjp.proceed() 在有多个通知方法匹配时,更准确的描述应该是这样的:

  • 如果还有下一个通知,则调用下一个通知
  • 如果没有下一个通知,则调用目标

那么它们的执行顺序是怎样的呢?

  • 默认按照 bean 的名称字母排序
  • @Order(数字) 加在切面类上来控制顺序       
    • 目标前的通知方法:数字小先执行
    • 目标后的通知方法:数字小后执行

十、切点表达式有几种,具体怎么定义?

1、3种

2、切点表达式用来匹配【哪些】目标方法需要应用通知,常见的切点表达式如下

  • execution(返回值类型 包名.类名.方法名(参数类型))        
    • * 可以通配任意返回值类型、包名、类名、方法名、或任意类型的一个参数
    • .. 可以通配任意层级的包、或任意类型、任意个数的参数
  • @annotation() 根据注解匹配
  • args() 根据方法参数匹配

十一、如果有多个通知的切点表达式一样,怎么抽取?

@PointCut

通过@PointCut注解,可以抽取一个切入点表达式,然后再其他的地方我们就可以通过类似于  方法调用 的形式来引用该切入点表达式。

    @Pointcut("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void pt(){}

    @Around("pt()")
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long begin = System.currentTimeMillis();
        //调用原始操作
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();
        log.info("执行耗时 : {} ms", (end-begin));
        return result;
    }

十二、连接点是什么可以获取哪些信息?

连接点简单理解就是 目标方法,在Spring 中用 JoinPoint 抽象了连接点,用它可以获得方法执行时的相关信息,如方法名、方法参数类型、方法实际参数等等

  • 对于 @Around 通知,获取连接点信息只能使用 ProceedingJoinPoint
  • 对于其他四种通知,获取连接点信息只能使用 JoinPoint,它是 ProceedingJoinPoint 的父类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个用于快速构建 Java 应用程序的框架。它可以与多种其他框架和组件进行整合,以实现更丰富的功能。在这里,我们将讨论如何使用 Spring Boot 整合 Druid、MyBatis、JTA 分布式事务以及多数据源,同时使用 AOP 注解实现动态切换。 首先,我们可以在 Spring Boot 中集成 Druid 数据源。Druid 是一个高性能的 JDBC 连接池,可以提供监控和统计功能。我们可以通过在 pom.xml 文件中添加相关的依赖,并在 application.properties 文件中配置数据源信息,来实现 Druid 的集成。 接下来,我们可以整合 MyBatis 框架,它是一种优秀的持久化解决方案。我们可以使用 MyBatis 来操作数据库,并将其与 Druid 数据源进行整合。为此,我们需要在 pom.xml 文件中添加 MyBatis 和 MyBatis-Spring 的依赖,并配置 MyBatis 的相关配置文件。 此外,我们还可以使用 JTA(Java Transaction API)实现分布式事务。JTA 可以在分布式环境中协调多个参与者的事务操作。我们可以在 pom.xml 文件中添加 JTA 的依赖,并在 Spring Boot配置文件中配置 JTA 的相关属性,以实现分布式事务的支持。 在实现多数据源时,我们可以使用 Spring Boot 的 AbstractRoutingDataSource 来实现动态切换数据源。这个类可以根据当前线程或其他条件选择不同的数据源来进行数据操作。我们可以通过继承 AbstractRoutingDataSource 并实现 determineCurrentLookupKey() 方法来指定当前数据源的 key。然后,在配置文件中配置多个数据源,并将数据源注入到 AbstractRoutingDataSource 中,从而实现动态切换。 最后,我们可以使用 AOP(Aspect Oriented Programming)注解来实现动态切换。AOP 是一种编程范式,可以通过在代码中插入特定的切面(Aspect)来实现横切关注点的处理。我们可以在代码中使用注解来标记需要切换数据源的方法,然后使用 AOP 技术来拦截这些方法,并根据注解中指定的数据源信息来进行数据源的切换。 综上所述,通过整合 Druid、MyBatis、JTA 分布式事务以及多数据源,并使用 AOP 注解实现动态切换,我们可以在 Spring Boot 中实现强大而灵活的应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值