共计 728 个字符,预计需要花费 2 分钟才能阅读完成。
一、背景
咱们在开发的过程中,常常会引入他人写的 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
正文完