品牌型号:联想ThinkPad X1
系统:Windows10家庭版
软件版本:Spring 5.3.7
Spring用久了会发现它在事务管理上很省心,以前事务需要我们手动控制,稍微复杂点的业务里,事务这部分的代码写起来很繁琐。现在我们可以借助Spring AOP的思路,把事务管理这块从业务代码里抽出来,变成了声明式的处理方式,我们不用再去手写那些重复的事务控制代码。有很多新手朋友不知道事务相关的代码该怎么写以及AOP的实现方式有哪些,下面就给大家介绍一下Spring中AOP实现事务代码如何写,Spring实现AOP的几种方式有哪些的相关内容。
一、Spring中AOP实现事务代码如何写
Spring里用AOP实现事务管理常见的写法是用@Transactional注解,这也是声明式事务的主要方式。用起来很简单,在需要事务控制的方法上面加上这个注解,Spring就会在背后通过AOP的代理机制,把事务的开启、提交、回滚这些动作自动织入到方法执行的前后,业务代码里完全看不到一行手动控制事务的语句。

不过,要让这个注解生效我们项目得先开启事务管理功能,如果用的是Java配置方式,就在配置类上加@EnableTransactionManagement,要是项目用的是XML配置,需要加上对应的tx命名空间配置。

容器里还得有一个事务管理器的Bean,例如开发中常用的DataSourceTransactionManager,这个对象负责真正去执行事务相关的底层操作,我们在用@Transactional注解本质上就是告诉Spring这个方法需要走事务管理器去控制。

@Transactional可以配置不少属性来控制事务的具体行为,例如propagation设置传播行为,rollbackFor指定遇到哪些异常需要回滚,isolation则是设置事务隔离级别,处理并发场景下的数据一致性问题。

二、Spring实现AOP的几种方式有哪些
Spring里实现AOP有好几种方式,在早期的时候,是基于Spring自带的AOP接口来实现,那会需要实现MethodBeforeAdvice、AfterReturningAdvice这类接口,然后配合XML配置文件把切面和目标对象关联起来。这种方式现在来看,有点过时了,因为接口种类多、配置繁琐,代码写起来也没什么可读性,基本我们只在一些老项目里还能看到。

我们也可以基于XML配置的方式,在配置文件里用AOP命名空间,定义切点表达式、通知类型,把这些跟具体的类和方法关联起来,可以做到配置和代码分离,改动逻辑不用动Java代码,但这种实现方式会导致配置文件写起来冗长,出了问题排查也不太方便,现在我们在项目中用得也不多了。

目前项目里都是基于注解的实现,我们通过@Aspect标注一个类作为切面,里面用@Before、@After、@Around、@AfterReturning、@AfterThrowing这些注解定义不同时机的通知,配合上@Pointcut注解来定义切点表达式,指定这些通知该作用在哪些方法上。这种方式代码集中而且可读性还高,把配置和逻辑写在一起改动起来方便,加上Spring Boot默认就开启了对这种注解的支持,基本上现在的项目都是这么写的。

除了上面这几种,还有一种是直接用AspectJ本身的编译时织入或者类加载时织入,这种属于更底层的AOP实现方式,功能比Spring AOP强,但配置起来很复杂,一般只有对性能和功能要求比较高的场景才会用,日常业务开发里我们碰到的不算多。

以上就是Spring中AOP实现事务代码如何写,Spring实现AOP的几种方式有哪些的全部内容了。事务这块我们使用@Transactional配合事务管理器即可搞定大部分场景,在配置传播行为、回滚规则时要注意同类方法内部调用导致事务失效这个问题,在实际开发中容易中招。AOP实现方式上,接口和XML这两种写法现在基本不太会再选了,注解方式因为写起来直观、维护方便,已经是事实上的主流,AspectJ原生织入则更适合一些特殊场景。