一、背景

咱们在开发的过程中,常常会引入他人写的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