SpringBoot Создание DynamicDataSource: запрашиваемый компонент находится в процессе создания: существует неразрешимая циклическая ссылка?

@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? 

Есть неразрешимая круговая ссылка? Как я могу это исправить?

спасибо за ваш ответ!

2 ответа

Решение

Вот в вашем случае, dynamicDataSource создание зависит от других 2 бобов slaveDataSource& masterDataSource, Так что вам нужно добавить @DependsOn на бобовых dynamicDataSource которые учат весну, что создание бобов dynamicDataSource зависит также от 2 других бобов.

Итак, ваша обновленная конфигурация должна выглядеть так:

@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;
}

обновленный

Согласно весенней документации,

Бобы, от которых зависит текущий боб. Все указанные бины гарантированно создаются контейнером до этого бина. Используется нечасто в тех случаях, когда бин явно не зависит от другого через свойства или аргументы конструктора, а скорее зависит от побочных эффектов инициализации другого бина.

Или для получения дополнительной информации, проверьте это Почему @DependsOn не имеет никакого эффекта

Упоминание @Order поверх bean-компонентов может решить эту проблему. Как вы можете упомянуть @Order(1),@Order(2)

или проверьте журналы, установив уровень журнала для отладки в application.properties

Другие вопросы по тегам