SpringAop同个类失效

在之前工作中遇到过同个类中事务调用失效的情况,原因是SpingAop不支持同个类中事务调用【@Transactional也一样,因为Spring中Transactional 也是基于AOP的 】,如下:

定义一个切面,检查DemoCheck注解.png

定义DemoCheck注解.png

Demo中有两个方法:sayHello方法被@DemoCheck标注,因此这是一个切点。
test方法调用sayHello方法。
Demo.png

执行sayHello方法测试:这里预期结果是执行切面,实际也执行了,没什么问题
执行方法.png

结果.png

执行test方法测试:这里预期结果首先执行test方法,调用sayhello方法时执行切面。结果并没有执行切面,可见aop失效
结果.png

原因分析
springAop是通过动态代理实现的(不论是jdk还是cglib),它将代理对象注入到spring容器中。当调用demo【代理对象】的test方法时,先执行切面(此处无切面),在执行被代理对象【实际对象】的test的方法,在实际对象的test中调用sayhello【其实this.hello更好理解】自然没有aop效果。
我们可以通过输入几个对象hashCode来验证一下:可见执行test和sayHello都是被代理对象【实际对象】
HashCode.png

解决方法
解决办法只需调用Spring容器中的test方法就好了,因此我们可以在原对象中定义一个代理对象的引用
改造后.png

结果.png

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,107评论 19 139
  • 这部分的参考文档涉及数据访问和数据访问层和业务或服务层之间的交互。 Spring的综合事务管理支持覆盖很多细节,然...
    竹天亮阅读 1,060评论 0 0
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,585评论 1 133
  • 冰棱木阅读 211评论 1 2
  • 秋风盈窗捲帘纱,市兰临台若晚霞。 满室清静淡如水,一庭红叶胜似花。 安适思驰动笔墨,闲情念寄好涂鸦。 有幸细品石菖...
    逸塵居士阅读 227评论 0 0