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

SpringBoot解決同名類導(dǎo)致的bean名沖突bean name conflicts問(wèn)題

 更新時(shí)間:2023年06月20日 09:37:14   作者:野猿新一  
這篇文章主要介紹了SpringBoot解決同名類導(dǎo)致的bean名沖突bean name conflicts問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringBoot同名類導(dǎo)致的bean名沖突bean name conflicts

問(wèn)題描述

項(xiàng)目中有兩個(gè)同名類都叫MyService,只是放在不同的包名下

package com.yeyuanxinyi;
@Service()
public class MyService {
}
package com.yeyuanxiner;
@Service()
public class MyService {
}

當(dāng)項(xiàng)目啟動(dòng)的時(shí)候會(huì)報(bào)如下錯(cuò)誤

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'MyService' for bean class [com.yeyuanxinyi.MyService] conflicts with existing, non-compatible bean definition of same name and class [com.yeyuanxiner.MyService]
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:348)
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:286)
    at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:132)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:287)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:199)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
    ... 13 common frames omitted

解決方法

問(wèn)題分析:

由于以上兩個(gè)同名類在用@Service注解的時(shí)候未指定value值,所以Spring Boot默認(rèn)會(huì)以類名作為bean name,由于兩個(gè)類名相同導(dǎo)致了bean name相同的沖突

可以通過(guò)為同名類指定不同的bean name來(lái)解決問(wèn)題,上面兩個(gè)同名類修改后如下

再次運(yùn)行項(xiàng)目就不會(huì)報(bào)錯(cuò)了

package com.yeyuanxinyi;
@Service("MyService1")
public class MyService {
}
package com.yeyuanxiner;
@Service("MyService2")
public class MyService {
}

同理,以上解決方法也適用于@Component

package com.yeyuanxiner;
@Component("MyComponent1")
public class MyComponent {
}

SpringBoot不同包結(jié)構(gòu)下,同名類沖突導(dǎo)致服務(wù)啟動(dòng)失敗解決方案

項(xiàng)目背景:

兩個(gè)項(xiàng)目的包結(jié)構(gòu)和類名都很多相同,于是開(kāi)始考慮使用加一級(jí)包進(jìn)行隔離,類似于這種結(jié)構(gòu)

但是在啟動(dòng)的過(guò)程中,拋出來(lái)這樣的異常:

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'nameConflict' for bean class [xom.liuyun.beannameconflict.modelB.NameConflict] conflicts with existing, non-compatible bean definition of same name and class [xom.liuyun.beannameconflict.modelA.NameConflict]

at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:348) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]

at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:286) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]

at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:132) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]

at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:284) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]

at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:241) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]

at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]

at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:166) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]

... 13 common frames omitted。

原因:

spring提供兩種beanName生成策略,基于注解的sprong-boot默認(rèn)使用的是AnnotationBeanNameGenerator,它生成beanName的策略就是,取當(dāng)前類名(不是全限定類名)作為beanName。由此,如果出現(xiàn)不同包結(jié)構(gòu)下同樣的類名稱,肯定會(huì)出現(xiàn)沖突。

解決方案如下

1. 自己寫一個(gè)類實(shí)現(xiàn) org.springframework.beans.factory.support.BeanNameGeneraot接口

public class UniqueNameGenerator extends AnnotationBeanNameGenerator {
?? ? @Override
? ? public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
? ? ? ? //全限定類名
? ? ? ? String beanName = definition.getBeanClassName();
? ? ? ? return beanName;
? ? }
}

2. 在啟動(dòng)類上加注解@ComponentScan(nameGenerator = UniqueNameGenerator.class)使剛才我們自定義的BeanName生成策略生效。 

@SpringBootApplication?
@ComponentScan(nameGenerator = UniqueNameGenerator.class)
public class BeanNameConflictApplication {??
? ? public static void main(String[] args) {?
? ? ? ? SpringApplication.run(BeanNameConflictApplication.class, args);?
? ? }?
}

這樣,問(wèn)題就可以解決了。

另外解決方式

解決辦法:

  • 一:將其中一個(gè)實(shí)現(xiàn)類改為不同的名字;
  •  二:將其中一個(gè)注解變更為一個(gè)name為非roleServiceImpl的注解@service(name="aaaa")。

別名:

@Autowired注解時(shí),屬性名即為默認(rèn)的Bean名,如下面的logPrint就是獲取beanName=logPrint的bean

@Resource(name=xxx) 直接指定Bean的name,來(lái)唯一選擇匹配的bean

說(shuō)明:

@Primary注解

這個(gè)注解就是為了解決當(dāng)有多個(gè)bean滿足注入條件時(shí),有這個(gè)注解的實(shí)例被選中

  •  @Resource 指定beanName的是否會(huì)被@Primary影響
  • 前面的@Autowired注解 + 屬性名的方式,是按照第一節(jié)的方式選擇呢,還是選擇被@Primary標(biāo)識(shí)的實(shí)例
  • @Autowired + 隨意的一個(gè)非beanName的屬性,驗(yàn)證是否會(huì)選中@Primary標(biāo)識(shí)的注解
  • 根據(jù)前面的執(zhí)行,因此可以知曉,選擇bean的方式如下

存在@Primary注解時(shí)

  • @Resource注解指定name時(shí),根據(jù)name來(lái)查找對(duì)應(yīng)的bean
  • @Autowired注解,全部都用@Primary標(biāo)識(shí)的注解
  • @Primary注解要求唯一(非廣義的唯一性,并不是指只能用一個(gè)@Primary,具體看前面)

不存在@Primary注解時(shí)

  • @Resource注解指定name時(shí),根據(jù)name來(lái)查找對(duì)應(yīng)的bean
  • @Autowired注解時(shí),根據(jù)屬性名去查對(duì)應(yīng)的Bean,如果查不到則拋異常;如果查到,那即是它了

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中實(shí)現(xiàn)map與對(duì)象相互轉(zhuǎn)換的幾種實(shí)現(xiàn)

    java中實(shí)現(xiàn)map與對(duì)象相互轉(zhuǎn)換的幾種實(shí)現(xiàn)

    這篇文章主要介紹了java中實(shí)現(xiàn)map與對(duì)象相互轉(zhuǎn)換的幾種實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java使用Socket類接收和發(fā)送數(shù)據(jù)

    java使用Socket類接收和發(fā)送數(shù)據(jù)

    Socket類是負(fù)責(zé)處理客戶端通信的Java類。本文主要是介紹java使用Socket類接收和發(fā)送數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • Java實(shí)現(xiàn)定時(shí)任務(wù)的方法詳解

    Java實(shí)現(xiàn)定時(shí)任務(wù)的方法詳解

    大家都用過(guò)鬧鐘,鬧鐘可以說(shuō)是一種定時(shí)任務(wù)。那么,在?Java?中,如何實(shí)現(xiàn)這樣的功能呢?即如何實(shí)現(xiàn)定時(shí)任務(wù)呢?本文就來(lái)詳細(xì)和大家聊聊
    2022-10-10
  • Java如何實(shí)現(xiàn)http接口參數(shù)和返回值加密

    Java如何實(shí)現(xiàn)http接口參數(shù)和返回值加密

    這篇文章主要介紹了Java如何實(shí)現(xiàn)http接口參數(shù)和返回值加密問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳解Springboot @Cacheable 注解(指定緩存位置)

    詳解Springboot @Cacheable 注解(指定緩存位置)

    這篇文章主要介紹了詳解Springboot @Cacheable 注解(指定緩存位置),使用? @Cacheable ?注解就可以將運(yùn)行結(jié)果緩存,以后查詢相同的數(shù)據(jù),直接從緩存中取,不需要調(diào)用方法,需要的朋友可以參考下
    2023-09-09
  • IDEA導(dǎo)入Eclipse項(xiàng)目全過(guò)程

    IDEA導(dǎo)入Eclipse項(xiàng)目全過(guò)程

    這篇文章介紹了如何將Eclipse項(xiàng)目導(dǎo)入到IntelliJ IDEA,并詳細(xì)步驟如下:新建一個(gè)文件夾,用IntelliJ IDEA打開(kāi),將項(xiàng)目導(dǎo)入,等待編譯完成,配置項(xiàng)目環(huán)境和結(jié)構(gòu),注意文件夾名稱可能不同,配置Tomcat,重新編譯項(xiàng)目并啟動(dòng)
    2025-11-11
  • Spring事務(wù)處理原理步驟詳解

    Spring事務(wù)處理原理步驟詳解

    這篇文章主要介紹了Spring事務(wù)處理原理步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java解決Collectors.toMap()空指針報(bào)錯(cuò)問(wèn)題的方法詳解

    Java解決Collectors.toMap()空指針報(bào)錯(cuò)問(wèn)題的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java解決Collectors.toMap()空指針報(bào)錯(cuò)問(wèn)題的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-03-03
  • Java中的命名與目錄接口JNDI基本操作方法概覽

    Java中的命名與目錄接口JNDI基本操作方法概覽

    這篇文章主要介紹了Java中的命名與目錄接口JNDI基本操作方法概覽,JNDI提供統(tǒng)一的客戶端API使得Java應(yīng)用程序可以和這些命名服務(wù)和目錄服務(wù)之間進(jìn)行交互,需要的朋友可以參考下
    2016-03-03
  • java中int轉(zhuǎn)string與string轉(zhuǎn)int的效率對(duì)比

    java中int轉(zhuǎn)string與string轉(zhuǎn)int的效率對(duì)比

    這篇文章主要介紹了java中int轉(zhuǎn)string與string轉(zhuǎn)int的效率對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論

阆中市| 九龙坡区| 昌乐县| 白河县| 醴陵市| 太谷县| 徐水县| 泽州县| 沈阳市| 依安县| 鄱阳县| 武夷山市| 淅川县| 泗阳县| 宣化县| 比如县| 镇宁| 县级市| 饶阳县| 大关县| 镇远县| 盐边县| 扎鲁特旗| 泸西县| 莱州市| 科尔| 应城市| 方山县| 梁平县| 石景山区| 武威市| 阳山县| 右玉县| 夏邑县| 格尔木市| 柘荣县| 水城县| 东丽区| 兰西县| 儋州市| 城固县|