当前位置: 首页 > wzjs >正文

python做的网站如何部署哈尔滨商城网站建设

python做的网站如何部署,哈尔滨商城网站建设,做网站公司职员工资,青岛网站建设王道下拉??MyBatis-Plus 的 Service 层循环依赖问题,指的是两个或多个 Service Bean 之间存在直接或间接的依赖关系,导致 Spring 容器在初始化时无法完成 Bean 的创建。以下是详细说明: 1. 循环依赖的典型场景 场景一:直接循环依赖 java …

MyBatis-Plus 的 Service 层循环依赖问题,指的是两个或多个 Service Bean 之间存在直接或间接的依赖关系,导致 Spring 容器在初始化时无法完成 Bean 的创建。以下是详细说明:

1. 循环依赖的典型场景

场景一:直接循环依赖

java

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate OrderService orderService; // 依赖OrderService
}@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate UserService userService; // 依赖UserService
}

场景二:间接循环依赖

java

@Service
public class AService {@Autowiredprivate BService bService;
}@Service
public class BService {@Autowiredprivate CService cService;
}@Service
public class CService {@Autowiredprivate AService aService; // 形成循环
}

2. 问题产生的根本原因

Spring 容器创建 Bean 时遵循以下步骤:

  1. 实例化:通过构造器创建对象。
  2. 属性注入:填充依赖的其他 Bean(如@Autowired)。
  3. 初始化:执行@PostConstruct等初始化方法。

当出现循环依赖时,会导致Bean A 在初始化时需要 Bean B,而 Bean B 初始化又需要 Bean A,形成死锁。

3. 循环依赖的危害

  • 启动失败:Spring 容器无法完成 Bean 的初始化,抛出BeanCurrentlyInCreationException
  • 运行时异常:即使通过 Setter 注入暂时解决,也可能在运行时因依赖未完全初始化而出现NullPointerException
  • 代码耦合:循环依赖反映了 Service 层职责划分不清晰,违反单一职责原则。

4. 解决方案

方案一:重构代码,解耦业务逻辑

将公共逻辑抽取到独立的工具类或 Service 中,避免双向依赖。

java

// 提取公共逻辑到新的Service
@Service
public class CommonService {public void commonMethod() {// 公共逻辑}
}@Service
public class UserServiceImpl implements UserService {@Autowiredprivate CommonService commonService;
}@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate CommonService commonService;
}
方案二:使用 Setter 注入或 @Lazy 延迟加载

java

@Service
public class UserServiceImpl implements UserService {private OrderService orderService;@Autowiredpublic void setOrderService(@Lazy OrderService orderService) {this.orderService = orderService;}
}@Service
public class OrderServiceImpl implements OrderService {private UserService userService;@Autowiredpublic void setUserService(@Lazy UserService userService) {this.userService = userService;}
}
方案三:使用 ApplicationContext 手动获取 Bean

java

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate ApplicationContext context;public void someMethod() {// 手动获取OrderService,避免初始化时依赖OrderService orderService = context.getBean(OrderService.class);orderService.doSomething();}
}

5. 最佳实践

  1. 遵循单一职责原则:每个 Service 只负责单一业务领域。
  2. 依赖方向明确:上层 Service 依赖下层,避免双向依赖。
  3. 使用 DTO 隔离 Service:通过数据传输对象(DTO)传递数据,减少直接依赖。
  4. 单元测试:循环依赖可能导致测试困难,应编写单元测试验证依赖关系。

总结

MyBatis-Plus 的 Service 循环依赖本质是 Spring Bean 的循环依赖问题。解决的关键在于重构代码解耦,而非通过技术手段掩盖问题。合理的业务分层和依赖管理是避免循环依赖的根本方法。

MyBatis-Plus Service层循环依赖问题解析

一、问题本质

循环依赖发生在两个或多个Service组件相互引用时,形成初始化死锁。Spring容器通过三级缓存解决部分循环依赖,但构造器注入和复杂场景仍会导致启动失败。

二、核心解决方案对比
方案适用场景优缺点
代码重构中长期架构优化根治问题,但重构成本较高
@Lazy注解短期紧急修复快速生效,可能掩盖设计缺陷
Setter注入方法级依赖控制需要改造现有代码结构
ApplicationContext特殊场景延迟加载破坏IOC特性,增加耦合度
三、代码示例优化

场景:订单服务与用户服务解耦

// 抽象公共查询逻辑
public interface BaseQueryService<T> {default T getCachedEntity(Long id) {// 通用缓存查询逻辑}
}@Service
public class UserServiceImpl implements UserService, BaseQueryService<User> {// 实现类特有方法
}@Service
public class OrderServiceImpl implements OrderService, BaseQueryService<Order> {@Autowiredprivate UserService userService;public OrderDetailDTO getOrderDetail(Long orderId) {Order order = getCachedEntity(orderId);User user = userService.getCachedEntity(order.getUserId());return new OrderDetailDTO(order, user);}
}

四、深度防御策略
  1. 架构层面

    • 采用分层架构:明确Controller -> Service -> Manager -> DAO调用链
    • 引入领域驱动设计(DDD),划分限界上下文
  2. 编码规范

    // 良好实践示例:单向依赖
    @Service
    public class PaymentService {private final OrderService orderService;@Autowired  // 构造器注入明确强依赖public PaymentService(OrderService orderService) {this.orderService = orderService;}
    }
    

  3. 检测手段

    • 使用ArchUnit进行架构测试
    @ArchTest
    public static final ArchRule service_layer_dependencies = layeredArchitecture().layer("Service").definedBy("..service..").layer("DAO").definedBy("..dao..").whereLayer("Service").mayOnlyBeAccessedByLayers("Controller");
    

  4. 依赖可视化

    graph TDA[UserController] --> B[UserService]B --> C[UserManager]C --> D[UserMapper]E[OrderController] --> F[OrderService]F --> C[UserManager]F --> G[OrderMapper]
    

五、特殊场景处理

异步初始化场景:

@Configuration
public class AsyncConfig {@Bean(name = "taskExecutor")public Executor asyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(25);return executor;}
}@Service
public class AsyncService {@Async("taskExecutor")public void asyncProcess(Long entityId) {// 异步处理逻辑}
}

六、性能影响分析
  1. 循环依赖解决机制对启动时间的影响

    • 三级缓存查找增加O(n)时间复杂度
    • 复杂依赖链可能使启动时间呈指数增长
  2. 内存占用对比

    注入方式内存开销初始化速度
    构造器注入
    Setter注入
    @Lazy代理
七、监控与调试
  1. 诊断命令

    # 查看Bean创建顺序
    java -jar app.jar --debug | grep 'Creating bean'# 获取依赖图
    curl -X POST http://localhost:8080/actuator/beans
    

  2. 关键日志分析

    DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'userService'
    DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'orderService'
    WARN  o.s.b.f.s.DefaultListableBeanFactory - Bean creation exception on currently created bean: Circular dependencies: userService -> orderService -> userService
    

八、演进路线建议
  1. 短期方案

    • 使用@Lazy临时解除依赖环
    • 优先解决启动失败的紧急问题
  2. 中期优化

    • 引入依赖注入框架(如Dagger)辅助分析
    • 实施模块化改造(Java 9+ Module System)
  3. 长期规划

    • 建立领域服务地图
    • 实施微服务拆分(当单体应用复杂度超出阈值时)
    @startuml
    package "User Service" {[User API][User DB]
    }package "Order Service" {[Order API][Order DB]
    }[User API] --> [Order API] : RESTful
    @enduml
    

通过系统化的解决方案和渐进式架构优化,可有效消除循环依赖并提升系统可维护性。建议结合SonarQube等代码质量平台建立长期监控机制,防止问题回潮。

http://www.dtcms.com/wzjs/829740.html

相关文章:

  • 常州云计算网站建设和外国人做ic生意的网站
  • 帝国cms网站禅城专业网站建设公司
  • 大连中山网站建设怎么查网站的域名备案价格
  • 旅游电子商务网站开发方案房地产推广策略
  • 潮州市网站建设网站模板整站资源
  • 网站免费关键词如何做制作网站的心得
  • 广西住房建设厅网站企业年报查询官网入口
  • 郑州市网站设计公司哪个好音乐分享网站开发
  • google 网站打不开建网站的手机软件
  • 网站网站开发逻辑网站全新改版如何做
  • 360提示危险网站原因网站建设广告投放是什么
  • 华为手机网站建设策划方案论文项目建设对企业的意义
  • 网站后台服务器内部错误河北辛集市城乡建设管理局网站
  • 做网站 插件旅游景点网页制作
  • 网站百度搜不到python语言基础知识
  • react怎么做pc网站成都住建局官网个人住房信息查询
  • 做网站顾客提现金额后台网站转化分析
  • 网站开发里程碑北京综合网站建设报价
  • 哪个网站可以做卖房网站忧化教程
  • 专业营销型网站建设公司画家个人网站建设
  • 做网站如何选择颜色玩具网站规划说明书购物网站
  • 旅游网站模块招标网免费
  • 自已买域名做网站要多少钱锦兴建筑人才招聘平台
  • 北京建设企业协会网站首页怎样建设一个公司网站
  • 网站文章关键字密度wordpress文章有模板
  • 上海企业网站营销电话品牌vi标志设计公司
  • 与铁路建设相关的网站中国建设银行河北省分行官方网站
  • php网站开发软件语言个人博客响应式模板
  • 怎么做网站教程 用的工具上海网站建设平台
  • 网站平台搭建公共网站怎地做