apache / incubator-seata-samples

Apache Seata(incubating) Samples for Java
https://seata.apache.org/
Apache License 2.0
2.27k stars 1.91k forks source link

springcloud 项目启动时:seata配置datasource后与mybatisplus的dao循环引用 #193

Closed applefei closed 5 years ago

applefei commented 5 years ago

springcloud 项目seata配置DataSourceProxy后与mybatisplus的联合使用产生循环引用 1:pom文件

   <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-alibaba-seata</artifactId>
        <version>0.9.1.BUILD-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>io.seata</groupId>
                <artifactId>seata-spring</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>io.seata</groupId>
        <artifactId>seata-all</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
    </dependency>

     <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
    </dependency>

2:seata需要的DataSourceConfig @Configuration public class DataSourceConfig {

@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource() {
    DruidDataSource druidDataSource = new DruidDataSource();
    return druidDataSource;
}

/**
 * Seata 是通过代理数据源实现事务分支,所以需要先配置一个数据源的代理,.需要将 DataSourceProxy 设置为主数据源,否则事务无法回滚
 *
 * @param druidDataSource The DruidDataSource
 * @return The default datasource
 */
@Primary
@Bean("dataSource")
public DataSourceProxy dataSource(DruidDataSource druidDataSource) {
    return new DataSourceProxy(druidDataSource);
}

}

启动结果: The dependencies of some of the beans in the application context form a cycle:

storageTblServiceImpl (field protected com.baomidou.mybatisplus.core.mapper.BaseMapper com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.baseMapper) ↓ storageTblDao defined in file [E:\comfirstclouddemo\firstcloud-demo-seat-demo\firstcloud-demo-seat-storage\target\classes\com\firstcloud\demo\service\dao\StorageTblDao.class] ↓ sqlSessionFactory defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class] ┌─────┐ | dataSource defined in class path resource [com/firstcloud/demo/config/DataSourceConfig.class] ↑ ↓ | druidDataSource defined in class path resource [com/firstcloud/demo/config/DataSourceConfig.class] ↑ ↓ | org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker └─────┘

applefei commented 5 years ago

问题 已经解决 在启动类上添加 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})