一、背景
我們在開發(fā)的過程中,經(jīng)常會引入別人寫的jar包實現(xiàn)某些功能点弯。而別人的jar包一般都自動注入Spring容器中,假設(shè)別人都是通過@Bean
或@Component
注入的矿咕,并且沒有加入@ConditionalXXX
等注解抢肛,導(dǎo)致自己無法替換掉別人的實現(xiàn),假設(shè)這個時候我就是想替換掉碳柱,那么該如何實現(xiàn)呢捡絮?
二、需求
需求
由上圖可知莲镣,我們的需求為:
使用我們自己定義的 BananaProductService
替換掉框架自帶的AppleProductService
并加入到Spring容器中福稳,同時保證全局只有一個ProductService
的實現(xiàn)。
三瑞侮、實現(xiàn)思路
我們在系統(tǒng)中根據(jù) @Bean
或通過 @Component
定義的Bean對象在Spring中都會轉(zhuǎn)換成一個個的BeanDefinition
對象的圆,如果我們在Spring創(chuàng)建這些對象加入到Spring容器之前,將不想要的BeanDefinition
對象刪除半火,而加入我們自己想要的BeanDefinition
對象是不是就可以實現(xiàn)了越妈?而Spring提供的BeanDefinitionRegistryPostProcessor
接口正好可以幫助我們實現(xiàn)這個功能。
BeanDefinitionRegistryPostProcessor
是在系統(tǒng)加載完所有的BeanDefinition對象來進(jìn)行回調(diào)钮糖。
四梅掠、實現(xiàn)步驟
1、模擬第三方j(luò)ar包實現(xiàn)并加入Spring容器中
模擬第三方j(luò)ar包實現(xiàn)并加入Spring容器中
2、自己提供一個實現(xiàn)
自己提供一個實現(xiàn)
3瓤檐、替換掉jar包默認(rèn)的實現(xiàn)
替換掉jar包默認(rèn)的實現(xiàn)
4赂韵、進(jìn)行測試
進(jìn)行測試