Springboot整合Druid多数据源遇到的依赖循环问题

报错信息:

Description:

The dependencies of some of the beans in the application context form a cycle:

   modelEditorJsonRestResource (field private org.activiti.engine.RepositoryService com.example.demo.activity.config.ModelEditorJsonRestResource.repositoryService)
      ↓
   repositoryServiceBean defined in class path resource [org/activiti/spring/boot/DataSourceProcessEngineAutoConfiguration$DataSourceProcessEngineConfiguration.class]
      ↓
   processEngine defined in class path resource [org/activiti/spring/boot/DataSourceProcessEngineAutoConfiguration$DataSourceProcessEngineConfiguration.class]
      ↓
   springProcessEngineConfiguration defined in class path resource [org/activiti/spring/boot/DataSourceProcessEngineAutoConfiguration$DataSourceProcessEngineConfiguration.class]
┌─────┐
|  dataSource defined in class path resource [com/example/demo/datasources/config/MyDataSourcesConfig.class]
↑     ↓
|  firstDataSource defined in class path resource [com/example/demo/datasources/config/MyDataSourcesConfig.class]
↑     ↓
|  org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker

从上面可以看到:
1.创建sqlSessionFactory时需要dataSource
2.创建dataSource的时候,需要创建firsrDataSource和secondDataSource
3.然后创建firstDataSource时需要DataSourceInitializerInvoker
4.DataSourceInitializerInvoker又会去引用dataSource造成循环引用

解决办法:

1:启动类上加上@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

2.利用@DependsOn控制bean加载顺序

@Configuration
public class MyDataSourcesConfig {
    @Bean
    @ConfigurationProperties("spring.datasource.druid.ds1")
    public DataSource firstDataSource(){
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties("spring.datasource.druid.ds2")
    public DataSource secondDataSource(){
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    @DependsOn({"firstDataSource","secondDataSource"})
    public DynamicDataSource dataSource(DataSource firstDataSource,DataSource secondDataSource){
        Map targetDataSource = new HashMap<>();
        targetDataSource.put(DataSourceEnum.DS1.getValue(),firstDataSource);
        targetDataSource.put(DataSourceEnum.DS2.getValue(),secondDataSource);
        return new DynamicDataSource(firstDataSource,targetDataSource);
    }
}

 

你可能感兴趣的:(springcloud,java,SpringBoot)