前言
随着软件系统复杂度的提升,选择适合的架构风格对于项目的可维护性和可扩展性至关重要。本文将通过代码示例,详细对比 整洁架构 和 垂直切片架构(Vertical Slice Architecture, VSA)在 Spring Boot3.3 项目中的应用场景和实现方式。前后端代码集成使用 Thymeleaf 模板 + jQuery + Bootstrap,展示两种架构的不同特点及实现方法。
整洁架构
整洁架构(Clean Architecture) 是一种强调分层与职责分离的软件架构风格,其核心思想是将代码按照职责划分为不同的层次,通过明确的依赖规则,保证代码的高内聚和低耦合。整洁架构通常包含以下层次:
- 控制器层(Controller Layer):负责处理用户请求,调用服务层完成业务逻辑,并返回结果。
- 服务层(Service Layer):包含核心业务逻辑,负责协调数据访问和业务规则。
- 数据访问层(Repository Layer):负责与数据库或外部数据源的交互。
- 实体层(Entity Layer):定义核心数据模型,通常为持久化对象。
整洁架构的优点:
- 模块化:每一层有明确的职责,便于理解和维护。
- 可测试性:每一层的逻辑独立,便于单元测试。
- 可扩展性:新增功能或更换技术栈对其他层影响较小。
适用场景:复杂度较高、需要长期维护的大型系统。
垂直切片架构(Vertical Slice Architecture, VSA)
垂直切片架构 是一种按功能模块划分的软件架构风格。与传统的分层架构不同,VSA 将一个功能的所有代码(如控制器、服务、数据访问等)放在同一个模块中,模块之间相互独立,避免了跨模块依赖。
VSA 的核心思想是以业务功能为单位,将代码组织为多个“切片”(Slice),每个切片封装一个完整的功能:
- 独立性强:每个切片自成体系,不依赖其他模块。
- 简化开发:减少跨模块依赖,开发者只需关注单一功能。
- 快速迭代:新增功能仅需添加新的切片,不会影响现有系统。
VSA 的优点:
- 灵活性:便于快速开发新功能或修改现有功能。
- 隔离性:模块独立性强,减少变更的影响范围。
- 适应微服务:垂直切片架构可直接迁移到微服务架构中。
适用场景:业务功能明确、需要快速迭代的中小型系统或模块化较强的项目。
整洁架构实现
整洁架构通过层次划分(控制器、服务层、数据访问层),注重职责分离和模块化。以下以用户管理模块为例展示实现。
项目目录结构:
src/main/java/com/icoderoad
├── controller
│ └── UserController.java
├── service
│ ├── UserService.java
│ └── UserServiceImpl.java
├── repository
│ └── UserRepository.java
├── entity
│ └── User.java
实体类:
package com.icoderoad.entity;
import jakarta.persistence.*;
import lombok.Data;
@Data
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String email;
}
数据访问层:
package com.icoderoad.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.icoderoad.entity.User;
public interface UserRepository extends JpaRepository<User, Long> {
}
服务层接口定义:
package com.icoderoad.service;
import com.icoderoad.entity.User;
import java.util.List;
public interface UserService {
List<User> getAllUsers();
User createUser(User user);
}
接口实现:
package com.icoderoad.service;
import org.springframework.stereotype.Service;
import com.icoderoad.entity.User;
import com.icoderoad.repository.UserRepository;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public List<User> getAllUsers() {
return userRepository.findAll();
}
@Override
public User createUser(User user) {
return userRepository.save(user);
}
}
控制器:
package com.icoderoad.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.icoderoad.service.UserService;
import com.icoderoad.entity.User;
import java.util.List;
@Controller
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/users")
public String listUsers(Model model) {
List<User> users = userService.getAllUsers();
model.addAttribute("users", users);
return "user-list";
}
@PostMapping("/users")
public String createUser(User user) {
userService.createUser(user);
return "redirect:/users";
}
}
垂直切片架构实现
垂直切片架构将功能模块作为独立的切片,模块内包含该功能的所有逻辑。
项目目录结构:
src/main/java/com/icoderoad/usermanagement
├── User.java
├── UserController.java
├── UserService.java
├── UserRepository.java
实体类:
package com.icoderoad.usermanagement;
import jakarta.persistence.*;
import lombok.Data;
@Data
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String email;
}
数据访问层:
package com.icoderoad.usermanagement;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
服务层:
package com.icoderoad.usermanagement;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
public User createUser(User user) {
return userRepository.save(user);
}
}
控制器
package com.icoderoad.usermanagement;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
@Controller
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/users")
public String listUsers(Model model) {
List<User> users = userService.getAllUsers();
model.addAttribute("users", users);
return "user-list";
}
@PostMapping("/users")
public String createUser(User user) {
userService.createUser(user);
return "redirect:/users";
}
}
前端实现
整洁架构与垂直切片架构共用相同的前端实现。
user-list.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户列表</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container mt-5">
<h1>用户列表</h1>
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>邮箱</th>
</tr>
</thead>
<tbody>
<tr th:each="user : ${users}">
<td th:text="${user.id}"></td>
<td th:text="${user.username}"></td>
<td th:text="${user.email}"></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
总结
整洁架构注重模块化、职责分离,适合大型企业级应用;垂直切片架构独立性强,适合模块化程度高的系统。根据需求选择合适的架构,将为项目带来更高的可维护性和开发效率!