Spring中的事务实现、失效场景即AOP的相关概念理解

spring实现事务(声明式事务)的本质就是aop完成的,它会对方法的前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或回滚事务。aop就是面向切面编程,在spring中将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合度,事务处理就是其中一项重要应用。事项spring中的事务有两种方式编程式事务和声明式事务,其中编程式事务对业务代码有侵入性,项目中很少使用,应用更为广泛的是声明式事务。

spring中的事务在下面一些情况下会失效:

1.如果方法上自己处理捕获了目标的异常,没有抛出,就会导致事务失效。(原因:事务通知只有捕捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉)如:@Transactional注解标注的方法中try{有异常的代码}catch(Exception e){e.printStackTrace();}。解决方法:在catch块添加throw new RuntimeException(e)抛出。

2.方法抛出检查异常,报错也会导致事务失效。如:@Transactional注解标注的方法throws IOException(或其实现类如FileNotFoundException)(原因:Spring默认只会回滚非检查异常).解决方法:配置rollbackFor属性,如注解写为@Transactional(rollbackFor=Exception.class)

3.方法上不是public修饰的,也会导致事务失效(原因:spring为方法创建代理、添加事务通知前提条件都是方法是public的),解决方法:方法修饰词改成public。

AOP除了事务处理外还可以用来记录系统的操作日志。主要思路:使用aop中的环绕通知,用切点表达式找到记录日志的方法,也可以自定义注解(@annotation:指定一个注解,凡是标有此注解的方法都是切点,更推荐),然后通过环绕通知的参数获取请求方法的参数,比如类名、方法名、参数、返回值、异常信息、日志结果等,获取到这些参数后,保存到数据库

java 复制代码
@Aspect
@Component
public class LoggingAspect {
 
    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    @Pointcut("execution(* com.example.account.*.*(..))")
    public void accountOperation() {}

    @Before("accountOperation()")
    public void logBefore(JoinPoint joinPoint) {
        logger.info("Starting {} at {}", joinPoint.getSignature().getName(), LocalDateTime.now());
    }

    @AfterReturning(pointcut = "accountOperation()", returning = "result")
    public void logAfter(JoinPoint joinPoint, Object result) {
        logger.info("Finished {} at {} with result {}", joinPoint.getSignature().getName(), LocalDateTime.now(), result);
    }
}
相关推荐
嘻哈∠※9 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7989 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25810 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅10 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息12 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒12 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
喜欢的名字被抢了13 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
数据知道13 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
2601_9499506314 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
Rain的Java大神之路14 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq