使用AOP记录日志的时候@AfterThrowinng正常执行 sql已输出,数据未提交到数据库
最近开发需使用AOP方式实现日志记录,一开始未加上@Transactional注解,但是会提示will not be manager by spring,网上说在service上加上@Transactional即可。可是我在service上加上了该注解没效果。最后在controller上加上就有效果了。
but @AfterThrowing异常通知也可正常执行,sql已经打印出,记录的数据没有正常提交数据库。
查找原因及网上百度,原因是:Spring事务是通过AOP实现的,自己写的AOP与事务AOP存在执行顺序问题,如果事务AOP先执行了,@AfterThrowing中数据则无法提交。解决办法为@Aspect方法实现org.springframework.core .Ordered接口或使用@Order注解,推荐使用注解方式。
//实现接口方式
@Aspect
@Component
public class OperLogAspect implements Ordered {
private IExceptionLogService exceptionLogService; @Override public int getOrder() { return 1; } }//注解的方式(数字越小优先级约越高)
@Order(1) @Aspect @Component public class OperLogAspect { ... }