SpringBoot2基于重復(fù)創(chuàng)建bean的問(wèn)題及解決
SpringBoot2重復(fù)創(chuàng)建bean的解決
今天在跑程序的時(shí)候報(bào)了一個(gè)重復(fù)創(chuàng)建事務(wù)的異常:
***************************
APPLICATION FAILED TO START
***************************Description:
The bean ‘org.springframework.transaction.config.internalTransactionAdvisor’, defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class], could not be registered. A bean with that name has already been defined and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
是ProxyTransactionManagementConfiguration.class這個(gè)bean在創(chuàng)建時(shí)重復(fù)了,springboot的自動(dòng)裝配和我的程序同時(shí)創(chuàng)建了相同類(lèi)型的bean。
之所以報(bào)這個(gè)異常是因?yàn)樵赟pring2中增加了防止bean重復(fù)覆蓋的策略,如果有重復(fù)則會(huì)直接報(bào)出異常,而不是像從前一樣默默覆蓋,導(dǎo)致你的bean被莫名替換,難以排查問(wèn)題。
stackoverflow上的解答如下:
我這邊程序的解決方案是忽略spring的自動(dòng)裝配,禁止TransactionAutoConfiguration即可:
@SpringBootApplication(exclude = TransactionAutoConfiguration.class)
Spring注入Bean細(xì)節(jié)--解決Bean名稱(chēng)重復(fù)問(wèn)題
問(wèn)題描述:
org.springframework.context.annotation.ConflictingBeanDefinitionException
問(wèn)題原因:
在使用注解配置Bean的過(guò)程中,存在名稱(chēng)相同的情況,導(dǎo)致項(xiàng)目啟動(dòng)失敗
解決辦法
1)在配置實(shí)例化注解時(shí),指定別名
在mapper中使用@Repository注解來(lái)指定別名
//項(xiàng)目其他包中也存在相同的類(lèi)名稱(chēng)DepartmentMapper,這里使用value來(lái)指定別名 //正常情況下,因?yàn)榕渲梦募幸呀?jīng)配置了mapper包的掃描,所以可以省略@Repository注解,如果發(fā)生上述沖突,考慮使用別名來(lái)解決 @Repository(value="DepartmentMapper2") public interface DepartmentMapper { ?? ?//此處省略各種CRUD方法 }
2)在Service中指定所依賴(lài)的mapper
//這里也指定了service的別名 @Service(value="DepartmentService2") public class DepartmentServiceImpl implements DepartmentService{ ?? ?//這里指定依賴(lài)哪一個(gè)Mapper,默認(rèn)情況下使用ByName按類(lèi)名來(lái)指定 ?? ?@Resource(name="DepartmentMapper2") ?? ?private DepartmentMapper departmentMapper; ?? ?//省略各種service方法 }?? ?
如果service的類(lèi)名也沖突了怎么辦?
在service中,使用@Service配置在實(shí)現(xiàn)類(lèi)上,如果指定別名,可以利用value屬性來(lái)指定,另外,@Service中默認(rèn)括號(hào)中的字符串即是value的值,所以value可以省略
@Service("DepartmentService2")
對(duì)應(yīng)Controller
@Resource(name="DepartmentService2") private DepartmentService departmentService;
心得
在配置Bean的過(guò)程中所指定的別名相當(dāng)于以往XML中Bean屬性id的值
<bean id="beanname" class="xxx.xxx.Xxx"></bean>
再?gòu)?fù)習(xí)@Resource這個(gè)注解
//@Resource注入順序: 1.同時(shí)指定name和type,那么按照byname和bytype匹配唯一符合條件的bean裝配 // ? ? ? ? ? ? ? ? ? 2.指定name或者type,則按照指定方式匹配,默認(rèn)按name匹配,一旦指定type則不再使用屬性名匹配 // ? ? ? ? ? ? ? ? ? 3.如果都不指定,則按照屬性名(屬性名為類(lèi)名首字母小寫(xiě))匹配,如果沒(méi)有匹配到,按照屬性數(shù)據(jù)類(lèi)型匹配 // ? ? ? ? ? ? ? ? ? 以上不匹配則拋出異常 //@Resource 默認(rèn)按照ByName注入Bean //也就是尋找id為“DepartmentService”的Bean @Resource private DepartmentService departmentService; //所以可以指定name屬性來(lái)改變默認(rèn)規(guī)則 //這樣就尋找id為“DepartmentService2”的Bean @Resource(name="DepartmentService2") private DepartmentService departmentService; //也可以那個(gè)指定class來(lái)使用ByType注入 @Resource(type=DepartmentService.class) private DepartmentService departmentService; //注意import時(shí)要導(dǎo)正確的包
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Spring詳解如何配置數(shù)據(jù)源注解開(kāi)發(fā)以及整合Junit
Spring 是目前主流的 Java Web 開(kāi)發(fā)框架,是 Java 世界最為成功的框架。該框架是一個(gè)輕量級(jí)的開(kāi)源框架,具有很高的凝聚力和吸引力,本篇文章帶你了解如何配置數(shù)據(jù)源、注解開(kāi)發(fā)以及整合Junit2021-10-10Java工程的Resources目錄從基礎(chǔ)到高級(jí)應(yīng)用深入探索
這篇文章主要介紹了Java工程中的resources目錄,從基礎(chǔ)概念到高級(jí)應(yīng)用,涵蓋了如何創(chuàng)建、使用以及資源文件的加載方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01Mybatis-Plus中Mapper的接口文件與xml文件相關(guān)的坑記錄
這篇文章主要介紹了Mybatis-Plus中Mapper的接口文件與xml文件相關(guān)的坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01在Docker中部署Spring Boot項(xiàng)目過(guò)程詳解
這篇文章主要介紹了在Docker中部署Spring Boot項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08SpringBoot項(xiàng)目引入MCP的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot項(xiàng)目引入MCP的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04JAVA進(jìn)階篇之詳細(xì)了解File文件的常用API
這篇文章主要給大家介紹了關(guān)于JAVA進(jìn)階篇之詳細(xì)了解File文件的常用API的相關(guān)資料,File用于表示文件系統(tǒng)中的一個(gè)文件或目錄,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11Java8 LocalDateTime極簡(jiǎn)時(shí)間日期操作小結(jié)
這篇文章主要介紹了Java8-LocalDateTime極簡(jiǎn)時(shí)間日期操作整理,通過(guò)實(shí)例代碼給大家介紹了java8 LocalDateTime 格式化問(wèn)題,需要的朋友可以參考下2020-04-04