1.背景在开发过程中,我们经常会引入别人写的jar包来实现某些功能。别人的jar包一般都会自动注入到Spring容器中。假设别人通过@Bean或者@Component注入,不加@ConditionalXXX之类的注解,这样我就无法替换别人的实现。假设我此时只想替换它们。如果是这样,如何实现呢?2、需求从上图可以看出,我们的需求是:使用自己定义的BananaProductService替换框架自带的AppleProductService加入到Spring容器中,同时保证ProductService全局只有一个实现。3、实现思路在系统中,@Bean或@Component定义的Bean对象,在Spring中会被一一转化为BeanDefinition对象。如果我们在Spring中创建这些对象并将它们添加到Spring容器中,我们将不需要BeanDefinition对象。是不是可以删除和添加我们想要的BeanDefinition对象呢?Spring提供的BeanDefinitionRegistryPostProcessor接口可以帮助我们实现这个功能。BeanDefinitionRegistryPostProcessor是系统加载完所有BeanDefinition对象后的回调。四、实现步骤1、模拟第三方jar包的实现,添加到Spring容器中2、自己提供一个实现3、替换jar包的默认实现4、进行测试5、完整代码https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-override-exists-bean
