【问题标题】:SpringBoot Creating DynamicDataSource : Requested bean is currently in creation: Is there an unresolvable circular reference?Spring Boot 创建动态数据源:当前正在创建请求的 bean:是否存在无法解析的循环引用?
【发布时间】:2018-09-05 17:09:31
【问题描述】:
@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? 

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

谢谢你的回答!

【问题讨论】:

  • 请上传完整的错误日志
  • 将@DependsOn({"masterDataSource", "slaveDataSource"}) 添加到公共数据源数据源...
  • @Afridi 非常感谢你,它现在正在工作。但是,我就是不明白为什么会有循环引用。

标签: java spring spring-boot spring-data


【解决方案1】:

在您的情况下,dynamicDataSource 的创建依赖于其他 2 个 bean slaveDataSource& masterDataSource。所以你需要在 bean dynamicDataSource 上添加 @DependsOn,它指示 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 初始化的副作用。

或欲了解更多信息,请查看此Why @DependsOn has no effect

【讨论】:

  • @Bean(name = "dynamicTransactionManager") public DataSourceTransactionManager masterTransactionManager(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) dynamicTransactionManager 创建依赖于dynamicDataSource bean,但我们不需要添加@DependsOn("dynamicDataSource")。这让我很困惑
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 2017-10-01
    • 2020-03-24
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2018-05-08
    相关资源
    最近更新 更多