一、背景
咱们在开发的过程中,常常会引入他人写的jar包实现某些性能。而他人的jar包个别都主动注入Spring容器中,假如他人都是通过@Bean
或@Component
注入的,并且没有退出@ConditionalXXX
等注解,导致本人无奈替换掉他人的实现,假如这个时候我就是想替换掉,那么该如何实现呢?
二、需要
由上图可知,咱们的需要为:
应用咱们本人定义的 BananaProductService
替换掉框架自带的AppleProductService
并退出到Spring容器中,同时保障全局只有一个ProductService
的实现。
三、实现思路
咱们在零碎中依据 @Bean
或通过 @Component
定义的Bean对象在Spring中都会转换成一个个的BeanDefinition
对象,如果咱们在Spring创立这些对象退出到Spring容器之前,将不想要的BeanDefinition
对象删除,而退出咱们本人想要的BeanDefinition
对象是不是就能够实现了?而Spring提供的BeanDefinitionRegistryPostProcessor
接口正好能够帮忙咱们实现这个性能。
BeanDefinitionRegistryPostProcessor
是在零碎加载完所有的BeanDefinition对象来进行回调。
四、实现步骤
1、模仿第三方jar包实现并退出Spring容器中
2、本人提供一个实现
3、替换掉jar包默认的实现
4、进行测试
五、残缺代码
https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-override-exists-bean