美文网首页
SpringAop同个类失效

SpringAop同个类失效

作者: jjjjxd | 来源:发表于2018-06-04 16:48 被阅读0次

在之前工作中遇到过同个类中事务调用失效的情况,原因是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

相关文章

  • SpringAop同个类失效

    在之前工作中遇到过同个类中事务调用失效的情况,原因是SpingAop不支持同个类中事务调用【@Transactio...

  • SpringAOP-2

    SpringAOP实现代理-4 ( AOP config形式) 定义切面类 Aspect.java实现一个通知类...

  • Aop切面类中相关的对象

    JoinPoint对象 JoinPoint对象表示目标类连接点对象。封装了SpringAop中切面方法的信息,在切...

  • springboot事务失效解决-TransactionAspe

    事务失效解决 一 失效原因和写法(同一个类,controller调用有事务的方法) 一 事务生效解决(调用事务的...

  • spring框架 AOP

    10、 代理模式 为什么要学习代理模式?因为这就是SpringAOP的底层!【SpringAOP 和 Spring...

  • 1.SpringAop之ProxyConfig

    在SpringAop框架中封装了一些便利的基类,我们先从入门级的ProxyFactoryBean讲起,它的继承关系...

  • Spring切面

    SpringAOP 什么是面向切面编程 切面取代了继承和委托的方法。横切关注点被模块化一个特殊的类,叫做切面 AO...

  • java设计模式-代理模式(proxy pattern)

    简述 提到代理模式,脑海中第一个想到的就是springAop。日常工作中,我们用springAop来实现统一权限管...

  • Spring学习(五)AOP

    SpringAop使用到了了动态代理模式(有关设计模式见设计模式章节)。JDK动态代理代理的目标类必须要实现接口。...

  • 利用Spring AOP创建通知

    写在最前端 1.SpringAOP中共有六种通知类型,只要我们自定义一个类实现对应的接口,它们全都是org.spr...

网友评论

      本文标题:SpringAop同个类失效

      本文链接:https://www.haomeiwen.com/subject/lresdftx.html