开篇:为什么软件需要分层?
想象建造摩天大楼️:
// 混沌一体的代码示例
public class OrderController {
// 直接操作数据库
public void createOrder(OrderRequest request) {
// 验证逻辑
if (request.getAmount() <= 0) {
throw new IllegalArgumentException();
}
// 业务计算
double tax = request.getAmount() * 0.13;
// 直接访问数据库
try (Connection conn = DriverManager.getConnection(url);
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO orders VALUES (?,?)")) {
stmt.setDouble(1, request.getAmount());
stmt.setDouble(2, tax);
stmt.executeUpdate();
}
// 发送通知
EmailService.sendEmail(request.getUserEmail());
}
}
问题总结:
@startuml left to right direction package "表现层 (Presentation)" { [Controller] } package "业务层 (Business)" { [Service] } package "数据层 (Data)" { [Repository] } [Controller] --> [Service] : 调用 [Service] --> [Repository] : 调用 @enduml
层级 | 核心职责 | 技术实现 | 变更频率 |
---|---|---|---|
表现层 | 处理HTTP请求/响应 | @RestController | 高 |
业务层 | 核心业务逻辑处理 | @Service | 中 |
数据层 | 数据持久化操作 | @Repository | 低 |
通用层 | 工具类/配置/DTO | 静态类/配置类 | 极低 |
src/ ├─ main/ │ ├─ java/ │ │ └─ com/ │ │ └─ example/ │ │ ├─ config/ ← 配置类 │ │ ├─ controller/ ← 表现层 │ │ ├─ service/ ← 业务层接口 │ │ ├─ impl/ ← 业务层实现 │ │ ├─ repository/ ← 数据层 │ │ ├─ model/ ← DTO/Entity │ │ └─ Application.java
// 表现层
@RestController
@RequestMapping("/orders")
public class OrderController {
private final OrderService orderService;
@Autowired
public OrderController(OrderService orderService) {
this.orderService = orderService;
}
@PostMapping
public ResponseEntity createOrder(@RequestBody OrderRequest request) {
return ResponseEntity.ok(orderService.processOrder(request));
}
}
// 业务层接口
public interface OrderService {
OrderDTO processOrder(OrderRequest request);
}
// 业务层实现
@Service
public class OrderServiceImpl implements OrderService {
private final OrderRepository orderRepository;
private final TaxCalculator taxCalculator;
@Autowired
public OrderServiceImpl(OrderRepository orderRepository,
TaxCalculator taxCalculator) {
this.orderRepository = orderRepository;
this.taxCalculator = taxCalculator;
}
@Override
public OrderDTO processOrder(OrderRequest request) {
// 业务逻辑处理
double tax = taxCalculator.calculate(request.getAmount());
Order order = new Order(request.getAmount(), tax);
return orderRepository.save(order).toDTO();
}
}
// 数据层
@Repository
public interface OrderRepository extends JpaRepository {
// 自定义查询方法
@Query("SELECT o FROM Order o WHERE o.amount > :minAmount")
List findLargeOrders(@Param("minAmount") double minAmount);
}
// 定义支付接口
public interface PaymentService {
PaymentResult pay(Order order);
}
// 支付宝实现
@Service
public class AlipayService implements PaymentService {
// 具体实现
}
// 微信支付实现
@Service
public class WechatPayService implements PaymentService {
// 具体实现
}
// 定义订单事件
public class OrderCreatedEvent extends ApplicationEvent {
private final Order order;
public OrderCreatedEvent(Object source, Order order) {
super(source);
this.order = order;
}
}
// 事件发布
@Service
public class OrderService {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void createOrder(Order order) {
// ...保存订单
eventPublisher.publishEvent(new OrderCreatedEvent(this, order));
}
}
// 事件监听
@Component
public class NotificationListener {
@EventListener
public void handleOrderCreated(OrderCreatedEvent event) {
// 发送通知
}
}
指标 | 优秀值 | 警戒值 |
---|---|---|
层间依赖数 | ≤ 3 | > 5 |
接口实现比 | ≥ 80% | < 60% |
单层测试覆盖率 | ≥ 85% | < 70% |
循环依赖检测 | 0 | ≥ 1 |
// 反例1:业务层包含显示逻辑
@Service
public class ReportService {
public void generateReport() {
// 直接操作PDF生成工具
}
}
// 反例2:Controller直接访问数据库
@RestController
public class UserController {
@Autowired
private UserRepository userRepository; // 违反分层原则
}
╔══════════════════════════╗
║ 外部代理层 ║
║ Web/DB/UI/第三方服务适配器 ║
╚══════════════▲═══════════╝
│ 实现接口
╔══════════════▼═══════════╗
║ 接口适配层 ║
║ Controllers/Gateways ║
╚══════════════▲═══════════╝
│ 依赖注入
╔══════════════▼═══════════╗
║ 业务逻辑层 ║
║ Use Cases/Service核心 ║
╚══════════════▲═══════════╝
│ 抽象依赖
╔══════════════▼═══════════╗
║ 领域模型层 ║
║ Entities/Domain Objects ║
╚══════════════════════════╝
通过分层解耦,我们实现了:
马丁·福勒(Martin Fowler)的忠告:
"任何架构的核心使命,都是降低重要决策的修改成本。"
讨论话题:你在实际项目中遇到过哪些分层架构的挑战?欢迎分享解决方案!
推荐阅读:《企业应用架构模式》Martin Fowler 著