【Java】配置多数据源报错循环依赖

简介: 【Java】配置多数据源报错循环依赖

分析

首先,循环依赖是指在应用程序中,两个或更多的bean相互依赖,形成一个闭环。在Java中,这通常通过Spring框架的依赖注入来解决。

如果你在配置多个数据源时遇到循环依赖的问题,那么可能是由于你的数据源bean彼此之间存在着直接或间接的依赖关系。这可能是因为一个数据源bean的方法或构造函数中引用了另一个数据源bean,或者两个数据源bean都引用了一个共享的第三方bean,而这个第三方bean又引用了其中一个数据源bean。

解决这个问题的一种方法是使用@Lazy注解。Spring的@Lazy注解可以让Spring在需要的时候才去初始化bean,这样可以避免循环依赖的产生。

现象

Description:

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

bookInfoController (field private com.croot.portal.service.PortalBookInfoService

com.croot.portal.controller.BookInfoController.portalBookInfoService)

portalBookInfoService

commonService

commonMapper defined in file [D:\workspace\masterportal\rims\global-module\target\classes\com\croot\global\dao\CommonMapper.class]

sqlSessionFactory defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]

┌─────┐

| dynamicDataSource defined in class path resource [com/croot/portal/config/DataSourceConfig.class]

↑ ↓

| datasource1 defined in class path resource [com/croot/portal/config/DataSourceConfig.class]

↑ ↓

| org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker

避免

@Configuration  
public class DataSourceConfig {  
  
    @Bean  
    @Lazy  
    @ConfigurationProperties(prefix = "spring.datasource.one")  
    public DataSource dataSourceOne() {  
        return DataSourceBuilder.create().build();  
    }  
  
    @Bean  
    @Lazy  
    @ConfigurationProperties(prefix = "spring.datasource.two")  
    public DataSource dataSourceTwo() {  
        return DataSourceBuilder.create().build();  
    }  
}

在这个例子中,@Lazy注解让Spring在需要dataSourceOne或dataSourceTwo的时候才去初始化它们,避免了循环依赖的产生。

但是请注意,@Lazy只能解决由于自动装配(autowiring)导致的循环依赖问题。如果你的循环依赖问题是由于其他原因导致的,比如构造函数注入,那么你可能需要寻找其他的解决方案。例如,你可能需要重新设计你的类结构,避免数据源bean之间的直接依赖。

实战

sprintboot 低版本可以使用 spring.datasource.initialize=false (默认为true) 来解决,升级到sprintboot2.1.2后就发现被启用了

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

在启动类上增加这个属性即可!

目录
相关文章
|
11月前
|
JSON Java 数据格式
java调用服务报错400
java调用服务报错400
272 6
java调用服务报错400
|
11月前
|
JSON Java 数据格式
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
601 6
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
468 4
|
Android开发
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
699 4
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
|
Java
Java编程:理解while循环的使用
总结而言, 使用 while 迴圈可以有效解决需要多次重复操作直至特定條件被触发才停止執行任务场景下问题; 它简单、灵活、易于实现各种逻辑控制需求但同时也要注意防止因邏各错误导致無限迁璇発生及及時處理可能発生异常以确保程序稳定运作。
689 0
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
本文深入探讨了Java大数据技术在智能金融理财产品风险评估与个性化配置中的关键应用。通过高效的数据采集、存储与分析,Java大数据技术助力金融机构实现精准风险评估与个性化推荐,提升投资收益并降低风险。
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
|
人工智能 前端开发 Java
2025年WebStorm高效Java开发全指南:从配置到实战
WebStorm 2025不仅是一款强大的JavaScript IDE,也全面支持Java开发。本文详解其AI辅助编程、Java特性增强及性能优化,并提供环境配置、高效开发技巧与实战案例,助你打造流畅的全栈开发体验。
1012 4
|
Java 应用服务中间件 Linux
在Java 12环境中配置和部署Apache Tomcat的步骤。
这段部署Tomcat的冒险旅程充满技术挑战,但同时也像游戏一样充满乐趣。它需要你提前准备,仔细执行,并随时准备解决意外情况。成功后,你就可以在这匹强壮的网络野马上,带着你的Java应用,冲向Web开发的璀璨星空。
387 56