一、異常
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})