更换Spring容器中已经存在的Bean

分享
程序员 2024-9-2 21:30:42 8 0 来自 中国
一、配景

我们在开发的过程中,常常会引入别人写的jar包实现某些功能。而别人的jar包一样平常都主动注入Spring容器中,假设别人都是通过@Bean或@Component注入的,而且没有到场@ConditionalXXX等注解,导致自己无法更换掉别人的实现,假设这个时间我就是想更换掉,那么该怎样实现呢?
二、需求

1.png 由上图可知,我们的需求为:
利用我们自己界说的 BananaProductService更换掉框架自带的AppleProductService并到场到Spring容器中,同时包管全局只有一个ProductService的实现。
三、实现思绪

我们在体系中根据 @Bean或通过 @Component 界说的Bean对象在Spring中都会转换成一个个的BeanDefinition对象,假如我们在Spring创建这些对象到场到Spring容器之前,将不想要的BeanDefinition对象删除,而到场我们自己想要的BeanDefinition对象是不是就可以实现了?而Spring提供的BeanDefinitionRegistryPostProcessor接口恰好可以资助我们实现这个功能。
BeanDefinitionRegistryPostProcessor 是在体系加载完全部的BeanDefinition对象来举行回调。
四、实现步调

1、模仿第三方jar包实现并到场Spring容器中

2、自己提供一个实现

3、更换掉jar包默认的实现

4、举行测试

5.png 五、完整代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-override-exists-bean
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 16:29, Processed in 0.148395 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表