java - SpringBoot创建DynamicDataSource : Requested bean is currently in creation: Is there an unresolvable circular reference?

标签 java spring spring-boot spring-data

@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 个 bean slaveDataSourcemasterDataSource。因此,您需要在 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 ,

Beans on which the current bean depends. Any beans specified are guaranteed to be created by the container before this bean. Used infrequently in cases where a bean does not explicitly depend on another through properties or constructor arguments, but rather depends on the side effects of another bean's initialization.

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

关于java - SpringBoot创建DynamicDataSource : Requested bean is currently in creation: Is there an unresolvable circular reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49510385/

相关文章:

java - 动态查找 EJB

java - 如何使用 String.split (","导入 CSV 文件,而不会因空白字段而缩短数组?

java - 我如何暂停或使进度条在 Android 中显示为 false,以便它仅在单击时出现?

java - 如何将邮件中的base64图像附加到JavaMail和MimeMessageHelper?

具有 3 个字段身份验证和自定义登录表单的 Spring Boot 安全性

spring-boot - MapStruct 映射器返回空的映射对象

java - 奇数和偶数 Java 更新之间有什么区别?

java - 尝试使用 Spring 发出 HTTP 请求时出现奇怪的错误 "incompatible types required"

java - 避免使用 if 对于链式对象

mongodb - 如何在不依赖MongoDB的情况下启动spring-boot应用程序?