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其它相關文章!

推薦閱讀: