Spring在service层事物和@AfterThrowing添加日志冲突

本文探讨了在Spring AOP中@AfterThrowing方法在事务回滚前执行的问题,并提出了通过调整@Aspect类的Order属性来确保日志记录操作能够在事务回滚前完成的有效解决方案。

因为@AfterThrowing方法在service事物rollback之前执行(具体看源码),添加日志成功以后还是会被rollback

解决:

@AspectimplementsOrdered,事物添加Order属性。

@Aspectorder<aop:advisor order

Order小会先执行

<aop:advisor pointcut="execution(* com.web.*.service..*.*(..))"
			advice-ref="txAdvice" order="3"/>

order> aop:advisor order: transaction -> doBefore -> Exception -> @AfterThrowing -> rollback

order< aop:advisor order: doBefore -> transaction -> Exception -> rollback -> @AfterThrowing
order> aop:advisor 时日志生成后会被回滚,所以@Aspect类中order需比aop:advisor中配置的小




### 使用 Spring AOP `@AfterThrowing` 注解捕获异常 为了利用 `@AfterThrowing` 注解来捕获并处理应用程序中的异常,需创建一个切面类,并在其中定义带有此注解的方法。该方法会在被拦截的方法抛出特定类型的异常时触发。 #### 创建 Aspect 类 首先,确保项目已引入了 `spring-boot-starter-aop` 依赖项[^2]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.1.4.RELEASE</version> </dependency> ``` 接着,编写一个方面(Aspect)类用于捕捉异常: ```java import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class ExceptionHandlingAspect { /** * 当com.example.service包下的任何服务组件内的任意公共成员函数发生异常时, * 将会调用本方法进行统一的日志记录或其他业务操作。 */ @AfterThrowing( pointcut = "execution(* com.example.service..*.*(..))", throwing = "exception" ) public void logException(Throwable exception) { System.err.println("An error occurred: " + exception.getMessage()); // 可在此处添加更多复杂的错误处理逻辑,如发送邮件报警、写入数据库等 } } ``` 上述代码片段展示了如何配置切入点表达式以及指定要监听的异常对象名称参数 `throwing="exception"`。每当匹配的服务方法抛出了未被捕获的异常实例时,就会自动回调 `logException()` 方法来进行相应的处理工作[^1]。 此外,还可以进一步定制化异常处理器的行为模式,例如只针对某些具体的异常类型做出反应;或是结合其他AOP通知机制共同作用于同一个连接点之上等等[^3]。 #### 测试效果 假设存在如下简单的Service接口及其实现类: ```java @Service public class SampleServiceImpl implements SampleService { @Override public String performOperation() throws RuntimeException { throw new RuntimeException("Simulated runtime failure"); } } ``` 当调用了 `performOperation()` 并引发了运行时异常后,控制台将会输出由 `ExceptionHandlerAspect.logException()` 所打印的信息:“An error occurred: Simulated runtime failure”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值