前言:在前面的文字中《使用@Transactional遇见的问题,子方法回滚如何让父方法不回滚》,提到了对于静态(static)方法和非public方法,自调用,注解@Transactional是失效的。那么为什么会失效呢?大家都知道到注解@Transaction的底层实现是Spring AOP技术,而Spring AOP技术使用的是动态代理。那我就从代理的自调用说下(这里使用jdk代理)
自己写一个代理
![9a64ddea0178bd10182b27b6b5718149.png](https://i-blog.csdnimg.cn/blog_migrate/956931260dd3490575b1806e44f591c4.jpeg)
代理类
自调用代码
![2c3d57267a6846bc745335e0cee7eab9.png](https://i-blog.csdnimg.cn/blog_migrate/85692e971c78102b47f4757bceae4852.jpeg)
自调用代码
如图:在insertData中调用了insertData2方法。
![4a670d44aa6fe2456eb15e65d8d7aac8.png](https://i-blog.csdnimg.cn/blog_migrate/56decaa77772335383975dabc19d1500.jpeg)
自调用结果
打印中,只是代理了insertData方法,并没有代理insertData2方法。那么如何才能使insertData2被代理呢。我们可以把代理类拿到。在spring项目中可以通过getBean拿取,也可以通过自动注入拿到。我这里作为演示,就把代理对象传进来了。
![12d41b9bf3525369e36cbf843d50e333.png](https://i-blog.csdnimg.cn/blog_migrate/dddfd728e3bf2456a7d9dd4b8f7dbe7e.jpeg)
传入代理类
![2582ee32e850833a5d11cb52559db8ed.png](https://i-blog.csdnimg.cn/blog_migrate/2f5e077544211fc8aed35902ab399d74.jpeg)
执行结果
可以看到insertData2也被代理了。
总结:在实际开发中,自调用的情况,经常出现,所以在添加事务时,一定要注意下。