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的原理!!!!

猜你喜欢

转载自www.cnblogs.com/zhonghuahero/p/10123631.html
今日推荐