zoukankan      html  css  js  c++  java
  • 多个@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})

  • 相关阅读:
    柔性数组成员 (flexible array member)-C99-ZZ
    如何阅读 Redis 源码?ZZ
    linux下网络编程学习——入门实例ZZ
    leetcode Ch2-Dynamic Programming [2014]
    leetcode Ch1-search 2014
    Skip List & Bloom Filter
    指针的引用-ZZ
    leetcode-sudoku solver
    rest framework之过滤组件
    rest framework之渲染器
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/10843100.html
Copyright © 2011-2022 走看看