用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特性适合用于不需要容器管理的工具类如StringUtils1.2 关联关系稳定的伙伴关系关联Association表现为类成员变量在Spring中通常通过Autowired实现Entity public class User { Id private Long id; // 单向关联 OneToMany private ListOrder orders; } Service public class PaymentService { // 通过Autowired建立的关联 Autowired private NotificationService notificationService; }对比表特性依赖关系关联关系持续时间方法执行期间对象生命周期内代码表现方法参数/局部变量成员变量Spring实现直接new或静态调用Autowired或JPA注解UML箭头虚线箭头 →实线箭头 →提示在DDD设计中关联关系往往对应着领域模型中的核心关系2. 聚合与组合整体与部分的哲学2.1 聚合关系可独立存在的部分聚合Aggregation用空心菱形表示典型特征是部分可以脱离整体存在。电商系统中的经典案例public class ShoppingCart { private ListProduct products; // 商品可独立于购物车存在 public ShoppingCart(ListProduct products) { this.products products; } } // 商品可以单独创建 Product phone new Product(iPhone, 9999); ShoppingCart cart new ShoppingCart(List.of(phone));Spring Boot中的体现通过构造函数注入的BeanBean方法参数注入JPA中的ManyToMany关系2.2 组合关系生死与共的绑定组合Composition用实心菱形表示部分不能脱离整体存在。在Spring中表现为public class Order { // 订单项随订单创建销毁 private ListOrderItem 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; } }生命周期对比聚合关系整体删除不影响部分例如删除购物车商品仍存在组合关系整体删除则部分随之删除例如删除订单订单项必须级联删除// Spring Data JPA中的组合关系映射 Entity public class Order { Id private Long id; OneToMany(cascade CascadeType.ALL, orphanRemoval true) private ListOrderItem 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依赖-静态工具类如StringUtils3.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; } // 解决方案2Setter注入 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 ListAddress 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(/*...*/); } }架构建议核心领域用组合关系保证内聚性跨模块协作用聚合关系降低耦合工具类方法使用依赖关系基础设施组件用关联关系理解这些UML关系在Spring Boot中的实际表现能帮助我们在微服务拆分时做出更合理的架构决策。当你在代码中明确看到两个类之间的关系符号时应该能立即想到它在Spring上下文中的实现方式和生命周期影响。
别再死记硬背UML类图了!用Java/Spring Boot实战案例,5分钟搞懂依赖、关联、聚合与组合
发布时间:2026/6/1 8:41:10
用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特性适合用于不需要容器管理的工具类如StringUtils1.2 关联关系稳定的伙伴关系关联Association表现为类成员变量在Spring中通常通过Autowired实现Entity public class User { Id private Long id; // 单向关联 OneToMany private ListOrder orders; } Service public class PaymentService { // 通过Autowired建立的关联 Autowired private NotificationService notificationService; }对比表特性依赖关系关联关系持续时间方法执行期间对象生命周期内代码表现方法参数/局部变量成员变量Spring实现直接new或静态调用Autowired或JPA注解UML箭头虚线箭头 →实线箭头 →提示在DDD设计中关联关系往往对应着领域模型中的核心关系2. 聚合与组合整体与部分的哲学2.1 聚合关系可独立存在的部分聚合Aggregation用空心菱形表示典型特征是部分可以脱离整体存在。电商系统中的经典案例public class ShoppingCart { private ListProduct products; // 商品可独立于购物车存在 public ShoppingCart(ListProduct products) { this.products products; } } // 商品可以单独创建 Product phone new Product(iPhone, 9999); ShoppingCart cart new ShoppingCart(List.of(phone));Spring Boot中的体现通过构造函数注入的BeanBean方法参数注入JPA中的ManyToMany关系2.2 组合关系生死与共的绑定组合Composition用实心菱形表示部分不能脱离整体存在。在Spring中表现为public class Order { // 订单项随订单创建销毁 private ListOrderItem 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; } }生命周期对比聚合关系整体删除不影响部分例如删除购物车商品仍存在组合关系整体删除则部分随之删除例如删除订单订单项必须级联删除// Spring Data JPA中的组合关系映射 Entity public class Order { Id private Long id; OneToMany(cascade CascadeType.ALL, orphanRemoval true) private ListOrderItem 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依赖-静态工具类如StringUtils3.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; } // 解决方案2Setter注入 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 ListAddress 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(/*...*/); } }架构建议核心领域用组合关系保证内聚性跨模块协作用聚合关系降低耦合工具类方法使用依赖关系基础设施组件用关联关系理解这些UML关系在Spring Boot中的实际表现能帮助我们在微服务拆分时做出更合理的架构决策。当你在代码中明确看到两个类之间的关系符号时应该能立即想到它在Spring上下文中的实现方式和生命周期影响。