多個@bean無法通過@resource注入對應的bean(org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found )


一、異常

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 2: masterDataSource,slaveDataSource

二、場景分析

看異常提示這個類型”javax.sql.DataSource“的bean期待一個單例bean但是發現了2個:masterDataSource,slaveDataSource。看打印的堆棧:

 如上,我們發現有個DataSourceInitializer.init方法追蹤進去:

這里就給了我們一個靈感,DataSourceInitializer這個數據源初始化是spring boot自動配置類啟動的。如下圖

繼續追蹤異常:最終定位在DefaultListableBeanFactory.resolveNamedBean()中如下代碼塊:

如上圖第一,第二個箭頭分別取@Primary和@Priority2種注解注釋的bean,只要存在,就可以獲取bean並返回。

三、解決方案

1. 在其中一個bean上加@Primary,使得自動配置時不報錯。

1 @ConfigurationProperties(prefix = "study.datasource.master")
2 @Bean(name = "masterDataSource")
3 @Primary
4 public DataSource masterDataSource() {
5 }

 

2. 在啟動類注解:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM