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