Spring容器中已經(jīng)存在的Bean替換示例
一、背景
我們在開發(fā)的過程中,經(jīng)常會(huì)引入別人寫的jar包實(shí)現(xiàn)某些功能。而別人的jar包一般都自動(dòng)注入Spring容器中,假設(shè)別人都是通過@Bean
或@Component
注入的,并且沒有加入@ConditionalXXX
等注解,導(dǎo)致自己無法替換掉別人的實(shí)現(xiàn),假設(shè)這個(gè)時(shí)候我就是想替換掉,那么該如何實(shí)現(xiàn)呢?
二、需求
由上圖可知,我們的需求為:
使用我們自己定義的 BananaProductService
替換掉框架自帶的AppleProductService
并加入到Spring容器中,同時(shí)保證全局只有一個(gè)ProductService
的實(shí)現(xiàn)。
三、實(shí)現(xiàn)思路
我們在系統(tǒng)中根據(jù) @Bean
或通過 @Component
定義的Bean對象在Spring中都會(huì)轉(zhuǎn)換成一個(gè)個(gè)的BeanDefinition
對象,如果我們在Spring創(chuàng)建這些對象加入到Spring容器之前,將不想要的BeanDefinition
對象刪除,而加入我們自己想要的BeanDefinition
對象是不是就可以實(shí)現(xiàn)了?而Spring提供的BeanDefinitionRegistryPostProcessor
接口正好可以幫助我們實(shí)現(xiàn)這個(gè)功能。
BeanDefinitionRegistryPostProcessor
是在系統(tǒng)加載完所有的BeanDefinition對象來進(jìn)行回調(diào)。
四、實(shí)現(xiàn)步驟
1、模擬第三方j(luò)ar包實(shí)現(xiàn)并加入Spring容器中
2、自己提供一個(gè)實(shí)現(xiàn)
3、替換掉jar包默認(rèn)的實(shí)現(xiàn)
4、進(jìn)行測試
代碼地址
以上就是Spring容器中已經(jīng)存在的Bean替換示例的詳細(xì)內(nèi)容,更多關(guān)于Spring Bean容器替換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java自定義數(shù)組列表的實(shí)現(xiàn)操作
這篇文章主要介紹了Java自定義數(shù)組列表的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09完美解決Logback configuration error detected的問題
這篇文章主要介紹了完美解決Logback configuration error detected的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08深度解析Java中的國際化底層類ResourceBundle
做項(xiàng)目應(yīng)該都會(huì)實(shí)現(xiàn)國際化,那么大家知道Java底層是如何實(shí)現(xiàn)國際化的嗎?這篇文章就來和大家深度解析一下Java中的國際化底層類ResourceBundle,希望對大家有所幫助2023-03-03SpringBoot整合Swagger3生成接口文檔過程解析
這篇文章主要介紹了SpringBoot整合Swagger3生成接口文檔過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07基于Log4j2阻塞業(yè)務(wù)線程引發(fā)的思考
這篇文章主要介紹了基于Log4j2阻塞業(yè)務(wù)線程引發(fā)的思考,基于很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12