美文网首页
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同个类失效

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