最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot項目中出現(xiàn)同名bean異常報錯的解決方法

 更新時間:2024年01月09日 10:35:02   作者:linyb極客之路  
這篇文章給大家聊聊springboot項目出現(xiàn)同名bean異常報錯如何修復(fù),文中通過代碼示例給大家介紹解決方法非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

前言

最近業(yè)務(wù)部門接手供方的項目過來二開,其中有個認證實現(xiàn)因為業(yè)務(wù)需要,需要替換原有供方實現(xiàn)的邏輯。大概偽代碼如下。供方提供的接口以及默認實現(xiàn)形如下

public interface AuthCodeService {
    default Boolean check() {
        return true;
    }

}

@Service("authCodeService")
public class AuthCodeImpl implements AuthCodeService {

    public Boolean check() {
	    // doBiz
        return true;
    }
}

業(yè)務(wù)的替換實現(xiàn)如下

@Service
public class BizAuthCodeImpl implements AuthCodeService {

    public Boolean check() {
	    // doOtherBiz
        return true;
    }
}

然而項目運行的時候,發(fā)現(xiàn)走的認證邏輯始終是供方的邏輯,而非業(yè)務(wù)重寫后的邏輯。

平時因為跟業(yè)務(wù)的技術(shù)負責(zé)人走得比較近,他就私下找我交流一下思路。一開始我給他提的建議是說在你定制的業(yè)務(wù)類上加@Primary試下,他說他加了但沒效果。

于是我就跟他說不然你直接改供方源碼的默認實現(xiàn),他給的答復(fù)供方?jīng)]提供源碼,只提供jar。我就跟他說,這也可以改,你項目創(chuàng)建一個和供方實現(xiàn)一模一樣的類,就是包名和類名一模一樣,利用類的加載順序?qū)崿F(xiàn)。技術(shù)負責(zé)人又覺得這樣不好。

后面那個技術(shù)負責(zé)人想了一個方式,就是他將業(yè)務(wù)定制bean名稱和供方提供的bean名稱一樣,形如下

@Service("authCodeService")
public class BizAuthCodeImpl implements AuthCodeService {

    public Boolean check() {
	    // doOtherBiz
        return true;
    }
}

然后項目啟動,直接報了如下錯

org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'authCodeService' for bean class 

他就跟我說這個異常怎么修復(fù),鋪墊了這么久,引來了今天要聊的話題,同名bean異常報錯如何修復(fù)

解決思路

首先拋出一個觀點,在同個spring容器中,是不能出現(xiàn)同名的bean,因此解決的思路要么搞成不同的spring容器,要么就是排除多個同名的bean,只保留自己想要的那個。要么就是將bean改個名字。今天介紹的思路就是排除同名bean,只保留自己想要的bean

實現(xiàn)方法

1、方法一:通過@ComponentScan進行排除

示例配置

在springboot的啟動類上加上形如下內(nèi)容

@ComponentScan(basePackages = {"com.github.lybgeek"},excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = AuthCodeImpl.class)})

這邊有個注意點是當你啟動類上同時存在@SpringBootApplication和@ComponentScan注解時,@ComponentScan注解指定的掃描包路徑會覆蓋@SpringBootApplication的包路徑。

我將第一種方案告訴業(yè)務(wù)技術(shù)負責(zé)人后,他試了一下,果然沒報錯,但是后面出現(xiàn)一個問題,他說@SpringBootApplication的屬性exclude()失效了,導(dǎo)致他項目要排除的自動裝配類失效了。于是就有了第二種方案

2、方法二:自定義TypeExcludeFilter

我們點開@SpringBootApplication,可以看到如下內(nèi)容

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

既然@SpringBootApplication和@ComponentScan同時標注在啟動類上會有一定沖突,我們就遵循@SpringBootApplication提供的擴展方案就好了,自己寫一個TypeExcludeFilter進行排除

實現(xiàn)步驟

1、自定義TypeExcludeFilter

public class CustomTypeExcludeFilter extends TypeExcludeFilter {

    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
         String className = metadataReader.getClassMetadata().getClassName();
         return AuthCodeImpl.class.getName().equals(className);

    }
}

2、將自定義TypeExcludeFilter注入到spring容器 中

這邊有個特別需要注意的細節(jié)點,因為TypeExcludeFilter是要排除bean的,因此他注入的時機至少要在其他bean注入之前,具體來說就是在容器上下文refresh執(zhí)行之前,就得完成注入。在refresh之前執(zhí)行的擴展點有很多,我們就挑一個,我們以實現(xiàn)ApplicationContextInitializer為例

public class CustomTypeExcludeFilterApplicationContextInitializer implements ApplicationContextInitializer {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getBeanFactory();
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(CustomTypeExcludeFilter.class);
        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();

        defaultListableBeanFactory.registerBeanDefinition("customTypeExcludeFilter",beanDefinition);
    }
}

3、將ApplicationContextInitializer 的實現(xiàn)類放在/META-INF/spring.factories

org.springframework.context.ApplicationContextInitializer=\
com.github.lybgeek.context.CustomTypeExcludeFilterApplicationContextInitializer

按照上面三步執(zhí)行,就可以排除自己想排除的bean

總結(jié)

當項目中出現(xiàn)同名bean沖突時,如果可以的話,就盡量換個其他bean名稱來解決

后面業(yè)務(wù)負責(zé)人并沒有采用我上述的方案,我們回歸業(yè)務(wù)負責(zé)人他們項目訴求,他們的需求是要他們自定義認證的邏輯能生效,而非解決同名bean沖突。

業(yè)務(wù)負責(zé)人他們最后的方案是通過加@Primary注解解決,他之前加了覺得沒生效,是因為他們項目引的自定義認證邏輯的舊包,那個舊包沒加@Primary注解,后面把包升級就解決了

以上就是springboot項目中出現(xiàn)同名bean異常報錯的解決方法的詳細內(nèi)容,更多關(guān)于springboot出現(xiàn)同名bean的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Springboot內(nèi)嵌tomcat應(yīng)用原理深入分析

    Springboot內(nèi)嵌tomcat應(yīng)用原理深入分析

    懂得SpringBoot的童鞋應(yīng)該很清楚,不管應(yīng)用程序是屬于何種類型,都是一個Main方法走遍天下,對于web應(yīng)用,只需要引入spring-boot-starter-web中這個依賴,應(yīng)用程序就好像直接給我們來了個tomcat一樣,對于嵌入式Tomcat,其實也非常簡單,就是調(diào)用Tomcat提供的外部類
    2022-09-09
  • java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list錯誤解決辦法

    java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list

    這篇文章主要介紹了java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • springboot整合shiro登錄失敗次數(shù)限制功能的實現(xiàn)代碼

    springboot整合shiro登錄失敗次數(shù)限制功能的實現(xiàn)代碼

    這篇文章主要介紹了springboot整合shiro-登錄失敗次數(shù)限制功能,實現(xiàn)此功能如果是防止壞人多次嘗試,破解密碼的情況,所以要限制用戶登錄嘗試次數(shù),需要的朋友可以參考下
    2018-09-09
  • Java中l(wèi)ength,length(),size()詳解及區(qū)別

    Java中l(wèi)ength,length(),size()詳解及區(qū)別

    這篇文章主要介紹了Java中l(wèi)ength,length(),size()詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • java模擬微信搶紅包的實例代碼

    java模擬微信搶紅包的實例代碼

    現(xiàn)在搶紅包的功能很受歡迎,本篇文章主要介紹了java模擬微信搶紅包的實例代碼。具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Java工具類實現(xiàn)高效編寫報表

    Java工具類實現(xiàn)高效編寫報表

    對于報表數(shù)據(jù)大部分情況下使用寫sql的方式為大屏/報表提供數(shù)據(jù)來源,但是對于某些復(fù)雜情況下僅僅使用sql無法實現(xiàn),這篇文章主要介紹了Java工具類實現(xiàn)高效編寫報表
    2022-11-11
  • Springboot整合Flowable6.x導(dǎo)出bpmn20的步驟詳解

    Springboot整合Flowable6.x導(dǎo)出bpmn20的步驟詳解

    這篇文章主要介紹了Springboot整合Flowable6.x導(dǎo)出bpmn20,Flowable流程引擎可用于部署B(yǎng)PMN 2.0流程定義,可以十分靈活地加入你的應(yīng)用/服務(wù)/構(gòu)架,本文給出兩種從flowable導(dǎo)出流程定義bpmn20.xml的方式,需要的朋友可以參考下
    2023-04-04
  • Java 實現(xiàn)瀏覽器下載文件及文件預(yù)覽

    Java 實現(xiàn)瀏覽器下載文件及文件預(yù)覽

    這篇文章主要介紹了Java 實現(xiàn)瀏覽器下載文件及文件預(yù)覽,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 使用純java config來配置spring mvc方式

    使用純java config來配置spring mvc方式

    這篇文章主要介紹了使用純java config來配置spring mvc方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot使用easy-captcha 實現(xiàn)驗證碼登錄功能(解決思路)

    SpringBoot使用easy-captcha 實現(xiàn)驗證碼登錄功能(解決思路)

    文章介紹了如何使用Spring Boot和Easy-Captcha實現(xiàn)驗證碼登錄功能,后端通過Easy-Captcha生成驗證碼并存儲在Redis中,前端獲取驗證碼并顯示給用戶,登錄時,前端將用戶輸入的驗證碼和標識符發(fā)送到后端進行驗證,感興趣的朋友跟隨小編一起看看吧
    2025-02-02

最新評論

广东省| 临洮县| 大英县| 鹤峰县| 永嘉县| 鲁甸县| 故城县| 商都县| 牙克石市| 伊吾县| 哈密市| 通道| 阜城县| 敦化市| 文登市| 新龙县| 辉县市| 靖西县| 都兰县| 麦盖提县| 鄂托克前旗| 都昌县| 阿拉善盟| 盐山县| 汕尾市| 九寨沟县| 建始县| 营口市| 花莲县| 澳门| 密云县| 绥中县| 英德市| 定兴县| 油尖旺区| 甘德县| 井研县| 特克斯县| 鹤庆县| 阳高县| 威海市|