一、事出有因
最近有一个场景,因同一个项目中不同JAR包依赖同一个组件,但依赖组件的版本不同,导致无论使用哪个版本都报错(无法同时兼容两个JAR包中所需的方法调用),经过分析发现差异的部份是在一个BEAN中的方法出入参不同而矣,故考虑通过动态替换掉这个存在兼容性的BEAN,换成我们自己继承自该BEAN类并实现适配兼容方法,从而最终解决组件版本不兼容问题;
二、解决方案困境
但在实现的编码过程中发现,原依赖的那个BEAN并不是普通的通过标注@Compent之类的注解实现的注册的BEAN,而是由自定义的BeanDefinitionRegistryPostProcessor BEAN类中动态注册的BEAN,这样BEAN的注册顺序是"无法确定"的,我原本想通过自定义一个BeanDefinitionRegistryPostProcessor BEAN类,在postProcessBeanDefinitionRegistry方法中通过找到原依赖BEAN的名字,然后移除该名称对应的BEAN定义信息(BeanDefinition),最后再以原BEAN的名字定义并注册成为我自己的适配器的BEAN类,这样就实现了"移花接木"的功能,然而想法是OK的但最终运行起来,发现BEAN并没有成功被替换,究其原因发现,原来我自己定义的BeanDefinitionRegistryPostProcessor BEAN类是优先于原依赖的那个问题BEAN所对应的BeanDefinitionRegistryPostProcessor BEAN类之前执行的,这样就会导致在我的自定义BeanDefinitionRegistryPostProcessor BEAN类postProcessBeanDefinitionRegistry方法中并没有找到原依赖BEAN名字对应的BeanDefinition,也就无法进行正常的替换了,如果说文字难看懂,可以见如下图所示: