Spring 事务失效了,怎么办?
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
摘要
松哥正在录制TienChin项目视频,该项目使用Spring Boot和Vue3技术栈,并探讨多项技术。在微信上,有小伙伴提出了关于Spring事务失效的问题,松哥认为这与AOP的原理相关,因此分享了以下信息。
1. AOP的原理
AOP基于动态代理,分为JDK动态代理和CGLIB动态代理。JDK动态代理通过接口、拦截器和反射机制工作,而CGLIB动态代理通过ASM框架修改字节码来生成子类。Spring默认使用JDK动态代理,但如果没有接口,则使用CGLIB。从Spring Boot 2.0开始,无论是否有接口,都默认使用CGLIB。不过,用户可以通过配置来改变代理方式。
2. 实际用的类
AOP的使用意味着实际操作的不是原始类,而是被代理的类。例如,在动态数据源切换中,使用自定义注解和AOP来代理方法。但是,当在一个类的方法内部直接调用另一个加了注解的方法时,代理可能不生效。例如,在UserService类中,如果count2()方法直接调用了加了@DS注解的count()方法,那么代理及其注解可能不起作用。
3. 问题解决
针对这个问题,一种简单的解决办法是在类中注入自身的代理对象,再通过代理对象调用方法。虽然这解决了问题,但它不是最佳实践,因为在新版Spring Boot中,这需要开启循环依赖。设计时应避免此类问题。
最后,松哥提醒,了解了这个AOP代理问题,Spring事务失效的问题也就容易理解了,并再次提到了TienChin项目视频。
想要了解更多内容?