乐趣区

关于java:替换Spring容器中已经存在的Bean

一、背景

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

退出移动版