在之前工作中遇到过同个类中事务调用失效的情况,原因是SpingAop不支持同个类中事务调用【@Transactional也一样,因为Spring中Transactional 也是基于AOP的 】,如下:
定义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
网友评论