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

  • 相关阅读:
    c# IOSerialize 验证码、图片缩放
    SqlServer 分库分表
    权限系统数据库设计
    SqlServer 读写分离
    树转二叉树
    数据结构:图的存储结构之邻接矩阵、邻接表
    【数据结构】数据结构-图的基本概念
    哈夫曼树
    二叉树遍历方法
    Oracle 检查约束check
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/10843100.html
Copyright © 2011-2022 走看看