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

别再死记硬背UML类图了!用Java/Spring Boot实战案例,5分钟搞懂依赖、关联、聚合与组合

用Spring Boot实战拆解UML类图:依赖、关联、聚合与组合的代码表达艺术

在Java开发的世界里,UML类图常被视为"设计师的玩具"而遭开发者冷遇。但当你面对一个复杂的Spring Boot微服务系统时,能否准确识别两个类之间是聚合还是组合关系,往往决定了代码的健壮性。本文将以电商系统中的用户-订单-商品模块为例,带你用Spring Boot的视角重新理解这些UML关系。

1. 从Spring Boot看UML四大关系本质

1.1 依赖关系:最松散的临时合作

依赖(Dependency)是UML中最短暂的关系,体现在方法参数、局部变量或静态方法调用中。在Spring Boot中,这种关系常出现在服务层的业务逻辑中:

@Service public class OrderService { // 方法参数形式的依赖 public void validateOrder(OrderValidator validator) { validator.checkStock(); } // 局部变量形式的依赖 public String generateReport() { DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE; return formatter.format(LocalDate.now()); } }

关键特征

  • 生命周期:被依赖对象由外部创建,方法结束即解除关系
  • Spring特性:适合用于不需要容器管理的工具类(如StringUtils

1.2 关联关系:稳定的伙伴关系

关联(Association)表现为类成员变量,在Spring中通常通过@Autowired实现:

@Entity public class User { @Id private Long id; // 单向关联 @OneToMany private List<Order> orders; } @Service public class PaymentService { // 通过@Autowired建立的关联 @Autowired private NotificationService notificationService; }

对比表

特性依赖关系关联关系
持续时间方法执行期间对象生命周期内
代码表现方法参数/局部变量成员变量
Spring实现直接new或静态调用@Autowired或JPA注解
UML箭头虚线箭头 →实线箭头 →

提示:在DDD设计中,关联关系往往对应着领域模型中的核心关系

2. 聚合与组合:整体与部分的哲学

2.1 聚合关系:可独立存在的部分

聚合(Aggregation)用空心菱形表示,典型特征是部分可以脱离整体存在。电商系统中的经典案例:

public class ShoppingCart { private List<Product> products; // 商品可独立于购物车存在 public ShoppingCart(List<Product> products) { this.products = products; } } // 商品可以单独创建 Product phone = new Product("iPhone", 9999); ShoppingCart cart = new ShoppingCart(List.of(phone));

Spring Boot中的体现

  • 通过构造函数注入的Bean
  • @Bean方法参数注入
  • JPA中的@ManyToMany关系

2.2 组合关系:生死与共的绑定

组合(Composition)用实心菱形表示,部分不能脱离整体存在。在Spring中表现为:

public class Order { // 订单项随订单创建销毁 private List<OrderItem> items = new ArrayList<>(); public void addItem(Product p, int quantity) { items.add(new OrderItem(p, quantity)); // OrderItem由Order管理 } } // OrderItem不能单独存在 public class OrderItem { private Product product; private int quantity; OrderItem(Product product, int quantity) { this.product = product; this.quantity = quantity; } }

生命周期对比

  1. 聚合关系:

    • 整体删除不影响部分
    • 例如:删除购物车,商品仍存在
  2. 组合关系:

    • 整体删除则部分随之删除
    • 例如:删除订单,订单项必须级联删除
// Spring Data JPA中的组合关系映射 @Entity public class Order { @Id private Long id; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) private List<OrderItem> items; }

3. Spring Bean生命周期中的UML关系实践

3.1 单例Bean与原型Bean的选择

@Configuration public class AppConfig { // 组合关系 - 紧密绑定 @Bean public OrderService orderService() { return new OrderService(orderValidator()); } @Bean public OrderValidator orderValidator() { return new OrderValidator(); } // 聚合关系 - 松散耦合 @Bean @Scope("prototype") public ReportGenerator reportGenerator() { return new ReportGenerator(); } }

Bean作用域使用指南

关系类型推荐作用域典型应用场景
组合Singleton核心服务如OrderService
聚合Prototype有状态的工具类如ReportGenerator
关联Singleton基础设施组件如EmailService
依赖-静态工具类如StringUtils

3.2 循环依赖的破解之道

双向关联在Spring中可能导致循环依赖问题,解决方案:

// 问题代码 - 可能导致启动失败 @Service public class UserService { @Autowired private OrderService orderService; } @Service public class OrderService { @Autowired private UserService userService; } // 解决方案1:使用@Lazy @Service public class OrderService { @Lazy @Autowired private UserService userService; } // 解决方案2:Setter注入 @Service public class OrderService { private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } }

4. 实战:电商系统领域模型设计

4.1 用户核心领域建模

// 组合关系 - 用户与其认证信息 @Entity public class User { @Id private Long id; @Embedded // 组合关系 private Credential credential; @OneToMany(mappedBy = "user") // 聚合关系 private List<Address> addresses; } @Embeddable public class Credential { private String encryptedPassword; private LocalDateTime passwordUpdatedAt; }

4.2 订单处理状态模式

// 状态模式中的UML关系应用 public class Order { private OrderState state; // 组合关系 public void cancel() { state.handleCancel(); } } public interface OrderState { void handleCancel(); } // 具体状态类 public class PaidState implements OrderState { @Autowired // 依赖关系 private RefundService refundService; public void handleCancel() { refundService.process(/*...*/); } }

架构建议

  1. 核心领域用组合关系保证内聚性
  2. 跨模块协作用聚合关系降低耦合
  3. 工具类方法使用依赖关系
  4. 基础设施组件用关联关系

理解这些UML关系在Spring Boot中的实际表现,能帮助我们在微服务拆分时做出更合理的架构决策。当你在代码中明确看到两个类之间的关系符号时,应该能立即想到它在Spring上下文中的实现方式和生命周期影响。

http://www.zskr.cn/news/1439517.html

相关文章:

  • 基于稀疏判别集成学习的EEG情绪识别:自动通道选择与高效分类
  • 手把手教你用STM32F103的普通IO口读取SSI编码器(附差分电平转换模块接线)
  • AI生成视频与数字人
  • 冀州GEO优化公司|企业知识库升级维护,冀州AI搜索优化服务商选择指南 - 招财兔数字员工
  • ARC211
  • C51中断服务程序中的局部变量使用与优化
  • BI与AI融合:从数据报表到智能决策的实践路径
  • 温州乐清虹桥幼小衔接幼儿园综合实力排行 - 奔跑123
  • 2026 江苏镇江市(全区域服务)本地人必选彩钢瓦金属屋面防水防腐公司避坑指南 TOP5 推荐 - 本地便民网
  • 数据科学自由职业:5步构建个人品牌与稳定获客体系
  • 丙午年六一感怀
  • DuQuant++:针对MXFP4激活异常值的块对齐旋转量化优化方案
  • 从零到播放:手把手教你用LiveCMS+LiveSMS搭建一个可用的GB28181视频监控测试环境
  • 若依RuoYi-Vue项目实战:手把手教你集成微信小程序OpenID免密登录(Spring Security改造避坑)
  • 2026年最新德州市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • 杭州奢侈品包包回收排行榜,2026 金榜商家合扬诚信回收 - 合扬奢侈品交易中心
  • 告别数据标注!用Hugging Face的CLIP模型,5分钟搞定零样本图片分类(附完整代码)
  • 2026年最新定西市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • 告别虚拟机!在Windows 10/11上直接运行Swift代码的三种亲测方案
  • Dell R730老当益壮:ESXi 8.0 vs 7.0定制版怎么选?实测安装与驱动兼容性指南
  • 2026年最新东莞市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • Cortex-M3调试状态检测原理与实现方法
  • 跨视域融合技术,打破视频孪生场景联动壁垒
  • 从CT扫描到3D重建:DICOM中Patient Position字段的实战避坑指南
  • 南大CS保研,除了计科系,这四个“隐藏”学院也值得冲(附近三年录取数据)
  • 用示波器抓波形,手把手教你调试W25Q32 SPI Flash的读写时序(附常见波形问题分析)
  • PE装机佬的私藏利器:深度解析CGI增强版在U盘启动盘中的实战应用与配置技巧
  • 告别‘玄学’报错:手把手教你降级setuptools和wheel,成功安装Gym 0.18.3
  • 镜像孪生六大核心技术体系矩阵镜像视界|视频孪生·数字孪生·视频融合 全域空间透明化管理核心技术底座
  • STM32F103C8T6最小系统板与HC08蓝牙模块通信避坑指南:从接线、代码到手机APP调试