多個@bean沒法經過@resource注入對應的bean(org.springframework.beans.factory.NoUniqueBeanDefinitionException: No

1、異常

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

2、場景分析

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

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

這裏就給了咱們一個靈感,DataSourceInitializer這個數據源初始化是spring boot自動配置類啓動的。以下圖spa

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

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

3、解決方案

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})blog

相關文章
相關標籤/搜索