在工作中有一个在切面中需要记录一下操作日志的需求,而且要求这些操作日志要存入数据库,并且无论业务层有什么异常,日志照常记录,那就不能沿用业务层的事务,而是需要新启一个事务了。
sping的声明式事务就是靠AOP来实现的,一般事务都在业务层中启用,那如果要在AOP的逻辑中启用一个新的事务要怎么做呢?比如下面的例子:

//定义一个切点,这里指com.lidehang.remote包下所有的类的方法
@Pointcut("execution(public * com.lidehang.remote..*.*(..))")public void remote(){}//切点指定的方法执行完返回后调用
@AfterReturning(returning = "ret", pointcut = "remote()")public void doAfterReturning(JoinPoint joinPoint,Object ret) throws Throwable {//一些切面逻辑,包含了数据库操作,为了即便业务层的原事务回滚也不会影响切面中的数据库操作,需要启用新的事务
...}

经过我的测试,通过在doAfterReturning方法上加上注解@Transactional,并指定传播行为是REQUIRES_NEW依然不行。因为@Transactional也是声明式事务,本身就是AOP实现的,在AOP的代码中使用不起作用。所以就只能使用spring的编程式事务了,需要引入TransactionTemplate。如下:

@Autowired
private TransactionTemplate transactionTemplate;@AfterReturning(returning = "ret", pointcut = "remote()")public void doAfterReturning(JoinPoint joinPoint,Object ret) throws Throwable {
//声明式事务在切面中不起作用,需使用编程式事务
//设置传播行为:总是新启一个事务,如果存在原事务,就挂起原事务
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
transactionTemplate.execute(new TransactionCallback<T>() {
@Overridepublic T doInTransaction(TransactionStatus arg0) {//一些切面逻辑,包含了数据库操作
...
}
});}

通过以上的步骤,切面里的逻辑会在新事务中执行,执行完就会提交,和业务层中的原事务无关,即便执行完切面逻辑后继续执行业务代码的过程中出现异常,业务层中的数据库操作因为有原事务而回滚,但切面中的数据库操作不会回滚,因为这是个新的事务!

在Spring AOP切面中启用新事务相关推荐

  1. spring aop切面中获取代理bean的名字以及bean

    //切面中搞: Map<String , Object> map = (Map)ApplicationContextHelper.getBean(proceedingJoinPoint.g ...

  2. Spring AOP 切面@Around注解的具体使用

    @Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务. 比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@ ...

  3. 【经典】Spring aop切面实现异步添加日志—完整版

    系统开发中我们常遇到要处理系统日志等信息的,在此我分享一篇 利用spring aop切面来异步添加日志的操作,其中用到了 队列和多线程,前面的博客有写. 第一步:创建log实体,根据自己业务而定, p ...

  4. spring AOP切面日志

    spring AOP切面日志 导入依赖 <properties><fastjson.version>1.2.49</fastjson.version> </p ...

  5. Spring AOP切面的时候参数的传递

    Spring AOP切面的时候参数的传递 Xml: <?xml version="1.0" encoding="UTF-8"?> <beans ...

  6. spring aop 切面添加日志

    这是一个非常简单的spring aop切面添加日志的程序,下面来看一下这个程序 1.程序使用jar包 2.切面类LoggingAspect.java package com.cailei.aop.as ...

  7. Spring AOP切面使用详细解析

    相关文章: SpringBoot AOP切面的使用 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析) 架构师系列内容:架构师学习笔记(持续更新)) Spring AOP 应 ...

  8. 日志管理(spring AOP切面拦截)

    **最近,在写日志管理的东西呢,用了几种方法试,还是拦截比较好用,直接截下来传入到数据库中存储. 写的时候,真是头疼啊. 哦~对了,忘了说了,不需要用到Dao层哦. 首先,来一个POJO实体类吧,我看 ...

  9. Spring AOP 切面(Aspect)应用详解

    1. AOP 切面应用 下面是一个AOP切面的一个简单的应用实例 引入AOP依赖 <dependency><groupId>org.springframework.boot&l ...

  10. Spring aop切面插入事物回滚

    <!-- tx标签配置 事物--> <tx:advice id="txadvice" transaction-manager="transactionM ...

最新文章

  1. VS2015 win64下配置Opencv3.4.7
  2. 【模板】树链剖分 P3384
  3. java 8位随机数_JAVA中生成指定位数随机数的方法总结
  4. abstract不能和哪些关键字共存 学习
  5. 11岁美国男孩用玩具熊“黑”了国际网络安全大会
  6. hash和一致性hash
  7. Exchange_Server_2013在Windows_2008_R2部署
  8. python 大众点评模拟登陆_python项目实战:模拟登陆163邮箱,简单到爆
  9. 布局--------动态添加 相对布局
  10. mysql毫秒值转成日期_MySQL毫秒值和日期的指定格式的相互转换
  11. 干细胞研究最新进展(2022年4月)
  12. 服务器 端口映射 dmz,如何使用端口映射功能与 DMZ 主机设置
  13. TRIZ创新方法——因果链分析
  14. Golang + HTML5 实现多文件上传
  15. 高防服务器网站搭建专用死扛CC攻击有效处理高并发
  16. python语言入门h_python教程,pythonh学习线路图?
  17. 11月面完美团+网易+腾讯+百度+滴滴熬夜5天整理面经攒人品
  18. 乐视实行四天半工作制,贾跃亭羡慕的表示下周回国
  19. Appium简介与原理
  20. 56、基于51单片机 WiFi温湿度加四个继电器报警

热门文章

  1. 获取移动光猫(如HS8545M5等设备)pppoe密码明文
  2. android studio银联,android studio引入最新版银联支付功能
  3. paypal android sdk,Android Paypal SDK错误:商家不接受此类付款
  4. vscode快建创建vue模板
  5. tpac100控制器设置教程_TP-link AC控制器统一管理AP设置指导
  6. VS+Qt应用开发-设置软件图标
  7. GP数据库获取指定时段的所有天数
  8. c语言交通处罚单系统主函数,C语言课程设计交通处罚单管理系统.doc
  9. 连点器android版本,连点器安卓手机版
  10. 利用单片机做手机连点器(附别踩白块自动点击程序)