spring gclib final @Transactional
Posted zhonghuahero
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring gclib final @Transactional相关的知识,希望对你有一定的参考价值。
最近spring项目改造为spring boot项目,spring升级到5.0.x,遇到了一个奇葩问题,抽象类Class A的属性无法注入(@Autowired),debug调用某一方法时所有的注入对象全部为null。在改造之前是没有问题的。
排查步骤:
1:以为是mybatis的原因导致 不能直接注入抽象类,尝试方案:将抽象类Class A中的所有注入,转到一个新的类Class B(非抽象@Component),然后A注入类B的对象,曲线救国,不行
2:以为是抽象类无法实例化,把抽象类干掉,所有代码下放到子类Class C (原来继承Class A的类),不行
3:从头排查,删除Class C的所有代码,只保留一个注入对象,和一个空的方法Method m1,方法上没有任何注解,方法体只打印该注入对象是否为空,发现可以了,小激动一把。
4:逐步添加注入属性和方法,重复该步骤,没有重现问题。居然!!!!!!WC
5:跟原来的类做对比,终于发现 细微差异 旧代码中方法用了 @Transactional注解,然后试着在新的代码的方法头也增加该注解,问题重现!!!!!!
6:bing方案,发现蛛丝马迹,有一篇文章说到CGLib无法处理final,回头检查代码,果然如此!!!!!!
bug修改后研究了一下CGLib的原理!!!!
以上是关于spring gclib final @Transactional的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 使用 spring.datasource.data 的时候找不到数据文件