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
以上就是Spring容器中已經存在的Bean替換示例的詳細內容,更多關於Spring Bean容器替換的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- spring IOC控制反轉原理詳解
- SpringBoot如何自定義starter
- 向Spring IOC 容器動態註冊bean實現方式
- Springboot常用註解及配置文件加載順序詳解
- 詳解Spring中Lookup註解的使用