领域驱动设计(DDD)是一种软件开发方法论,强调围绕领域模型来设计软件,以应对复杂业务逻辑。Spring Boot 是一个快速开发框架,能帮助开发者快速搭建 Java 应用。将二者融合可以构建出高内聚、低耦合、易维护的软件系统。以下是融合实践的详细步骤和示例。
项目结构设计
按照 DDD 的分层架构思想,结合 Spring Boot 项目结构,常见的目录结构如下:
src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ ├── application
│ │ │ ├── service
│ │ │ └── dto
│ │ ├── domain
│ │ │ ├── model
│ │ │ │ ├── entity
│ │ │ │ ├── valueobject
│ │ │ │ └── aggregate
│ │ │ ├── repository
│ │ │ └── service
│ │ ├── infrastructure
│ │ │ ├── persistence
│ │ │ │ ├── jpa
│ │ │ │ └── mapper
│ │ │ └── adapter
│ │ └── presentation
│ │ ├── controller
│ │ └── rest
│ └── resources
│ └── application.properties
└── test
└── java
└── com
└── example
领域层设计
领域层是 DDD 的核心,包含领域模型、领域服务和领域仓库接口。
领域模型
定义实体、值对象和聚合根。例如,以一个简单的订单系统为例,定义 Order 实体和 OrderItem 值对象。
package com.example.domain.model.entity;
import com.example.domain.model.valueobject.OrderItem;
import java.util.List;
public class Order {
private String orderId;
private List<OrderItem> orderItems;
public Order(String orderId, List<OrderItem> orderItems) {
this.orderId = orderId;
this.orderItems = orderItems;
}
public String getOrderId() {
return orderId;
}
public List<OrderItem> getOrderItems() {
return orderItems;
}
}
领域服务
处理领域内的复杂业务逻辑。例如,创建一个 OrderService 来处理订单的创建逻辑。
package com.example.domain.service;
import com.example.domain.model.entity.Order;
import com.example.domain.model.valueobject.OrderItem;
import java.util.List;
public interface OrderService {
Order createOrder(List<OrderItem> orderItems);
}
领域仓库接口
定义数据持久化的操作。例如,创建一个 OrderRepository 接口。
package com.example.domain.repository;
import com.example.domain.model.entity.Order;
public interface OrderRepository {
void save(Order order);
Order findById(String orderId);
}
应用层设计
应用层负责协调领域层的服务,处理业务用例。创建一个 OrderApplicationService 来调用领域服务和领域仓库。
package com.example.application.service;
import com.example.domain.model.entity.Order;
import com.example.domain.model.valueobject.OrderItem;
import com.example.domain.repository.OrderRepository;
import com.example.domain.service.OrderService;
import java.util.List;
public class OrderApplicationService {
private final OrderService orderService;
private final OrderRepository orderRepository;
public OrderApplicationService(OrderService orderService, OrderRepository orderRepository) {
this.orderService = orderService;
this.orderRepository = orderRepository;
}
public Order createAndSaveOrder(List<OrderItem> orderItems) {
Order order = orderService.createOrder(orderItems);
orderRepository.save(order);
return order;
}
}
基础设施层设计
基础设施层负责实现领域仓库接口,与数据库等外部资源交互。使用 Spring Data JPA 实现 OrderRepository 接口。
package com.example.infrastructure.persistence.jpa;
import com.example.domain.model.entity.Order;
import com.example.domain.repository.OrderRepository;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Repository
public class JpaOrderRepository implements OrderRepository {
@PersistenceContext
private EntityManager entityManager;
@Override
public void save(Order order) {
entityManager.persist(order);
}
@Override
public Order findById(String orderId) {
return entityManager.find(Order.class, orderId);
}
}
表现层设计
表现层负责接收用户请求,调用应用层服务,并返回响应。使用 Spring Boot 的 @RestController 注解创建一个 RESTful 接口。
package com.example.presentation.controller;
import com.example.application.service.OrderApplicationService;
import com.example.domain.model.entity.Order;
import com.example.domain.model.valueobject.OrderItem;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class OrderController {
private final OrderApplicationService orderApplicationService;
public OrderController(OrderApplicationService orderApplicationService) {
this.orderApplicationService = orderApplicationService;
}
@PostMapping("/orders")
public Order createOrder(@RequestBody List<OrderItem> orderItems) {
return orderApplicationService.createAndSaveOrder(orderItems);
}
}
配置 Spring Boot 项目
在 application.properties 中配置数据库连接等信息,同时在主应用类上添加 @SpringBootApplication 注解启动 Spring Boot 应用。
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
通过以上步骤,就完成了领域驱动设计与 Spring Boot 的融合实践,构建出一个遵循 DDD 分层架构的 Spring Boot 应用。
文章来源:https://lyscgs.cn