Spring Boot创建动态数据源:当前正在创建请求的bean:是否存在无法解析的循环引用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot创建动态数据源:当前正在创建请求的bean:是否存在无法解析的循环引用?相关的知识,希望对你有一定的参考价值。

@Bean(name = "masterDataSource")
@Primary
@ConfigurationProperties(prefix="spring.datasource.master")
public DataSource masterDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    return dataSource;
}

@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix="spring.datasource.slave")
public DataSource slaveDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    return dataSource;
}

@Bean(name = "dynamicDataSource")
public DataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
                             @Qualifier("slaveDataSource") DataSource slaveDataSource) {
    DynamicDataSource dynamicDataSource = new DynamicDataSource();
    Map<Object, Object> dataSourceMap = new HashMap<>();
    dataSourceMap.put("masterDataSource", masterDataSource);
    dataSourceMap.put("slaveDataSource", slaveDataSource);
    dynamicDataSource.setTargetDataSources(dataSourceMap);
    dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
    return dynamicDataSource;
}

这是我创建动态数据源的代码,但似乎有些不对劲

Error creating bean with name 'dynamicDataSource': Requested bean is currently in creation: Is there an unresolvable circular reference? 

是否有无法解决的循环引用?我该如何解决?

谢谢你的回答!

答案

在你的情况下,dynamicDataSource创建依赖于其他2豆slaveDataSourcemasterDataSource。所以你需要在bean @DependsOn上添加dynamicDataSource,它指示Spring创建bean dynamicDataSource也依赖于其他2个bean。

因此,您更新的配置应如下所示:

@DependsOn({"masterDataSource", "slaveDataSource"})
@Bean(name = "dynamicDataSource")
public DataSource dataSource(@Autowired @Qualifier("masterDataSource") DataSource masterDataSource, @Autowired @Qualifier("slaveDataSource") DataSource slaveDataSource) {
    DynamicDataSource dynamicDataSource = new DynamicDataSource();
    Map<Object, Object> dataSourceMap = new HashMap<>();
    dataSourceMap.put("masterDataSource", masterDataSource);
    dataSourceMap.put("slaveDataSource", slaveDataSource);
    dynamicDataSource.setTargetDataSources(dataSourceMap);
    dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
    return dynamicDataSource;
}

更新

根据Spring Documentation

当前bean所依赖的bean。指定的任何bean都保证在此bean之前由容器创建。在bean没有通过属性或构造函数参数显式依赖于另一个bean的情况下很少使用,而是依赖于另一个bean的初始化的副作用。

或者有关详细信息,请查看此Why @DependsOn has no effect

另一答案

在bean之上提及@Order可能会解决此问题。就像你可以提到@Order(1),@ Order(2)

或者通过在application.properties中将日志级别设置为debug来检查日志

以上是关于Spring Boot创建动态数据源:当前正在创建请求的bean:是否存在无法解析的循环引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用表单创建 mysql 数据库。我正在使用 spring boot

Spring Boot + Quartz:“请求的 bean 当前正在创建中:是不是存在无法解析的循环引用?”

Spring Boot 2.1.2 创建动态数据库连接只是为了运行查询

当我进行 Rest api 调用时,使用 Spring Boot 动态创建列/表

Spring Boot 工厂 Bean 创建顺序

在运行时更改 Java Spring Boot Bean