Spring Boot 项目——分层架构
在创建一个 Spring Boot 项目时,为了提高代码的可维护性、可扩展性和清晰度,通常会按照一定的分层架构进行设计。常见的分层架构包括以下几层:
1. Controller 层(Web 层)
- 作用:接收用户请求,并调用相应的业务逻辑,最终返回视图或数据。
- 职责:处理 HTTP 请求,调用 Service 层来执行业务逻辑,然后将结果返回给客户端。通常,Controller 层与前端直接交互。
- 组件:Spring MVC 中的
@RestController
或@Controller
注解。 - 示例:
@RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User getUserById(@PathVariable Integer id) { return userService.getUserById(id); } @PostMapping public User createUser(@RequestBody User user) { return userService.createUser(user); } }
2. Service 层(业务逻辑层)
- 作用:处理业务逻辑,通常是 Controller 层和 Repository 层之间的纽带。
- 职责:包含具体的业务处理代码,如数据验证、数据加工、调度等。Service 层不直接处理 HTTP 请求,而是处理具体的业务逻辑,通常依赖于 DAO 层来访问数据库。
- 组件:
@Service
注解。 - 示例:
@Service public class UserService { @Autowired private UserRepository userRepository; public User getUserById(Integer id) { return userRepository.findById(id).orElse(null); } public User createUser(User user) { return userRepository.save(user); } }
3. Repository 层(持久层)
- 作用:负责与数据库进行交互,执行 CRUD 操作。
- 职责:直接与数据库进行交互,通过 JPA、MyBatis、JDBC 等方式执行数据操作。常见的 Spring 数据库访问技术是 JPA 和 Spring Data JPA。
- 组件:
@Repository
注解,或者继承JpaRepository
、CrudRepository
等接口。 - 示例:
@Repository public interface UserRepository extends JpaRepository<User, Integer> { // JpaRepository 提供了基本的 CRUD 操作 }
4. Entity 层(实体层)
- 作用:表示数据库中的一张表,映射到 Java 类中。实体类通常包含表中的字段及对应的 getter 和 setter 方法。
- 职责:定义数据库表的结构。它通常包含属性、构造函数、getter 和 setter 方法,可能还会有一些业务逻辑(如验证)或其他注解(如验证注解)。
- 组件:JPA 实体类使用
@Entity
、@Table
、@Id
等注解。 - 示例:
@Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String userName; private String userPassword; private String userRegisterTime; // getters and setters }
5. DTO 层(数据传输对象层)
- 作用:传递数据的对象,通常用于 Controller 层和前端之间的数据交换,或者后端系统之间的交互。
- 职责:封装前端需要的数据,简化数据传输。DTO 通常不包含业务逻辑,而是用于数据传输。DTO 和实体类类似,但通常会避免直接暴露实体类的敏感信息。
- 示例:
public class UserDTO { private Integer id; private String userName; private String userRegisterTime; // getters and setters }
6. Exception 层(异常处理层)
- 作用:集中管理异常,捕获并处理应用程序中的各种异常。
- 职责:处理应用程序中的业务异常和系统异常。通常使用
@ControllerAdvice
或@ExceptionHandler
来全局处理异常,并返回友好的错误信息给用户。 - 组件:
@ControllerAdvice
注解。 - 示例:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) { return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND); } }
7. Configuration 层(配置层)
- 作用:用于存放 Spring 配置类,负责整个应用程序的配置。
- 职责:处理项目的所有配置内容,包括数据库配置、第三方 API 配置、消息队列配置等。Spring Boot 可以通过
@Configuration
或@EnableAutoConfiguration
自动配置项目。 - 组件:
@Configuration
注解。 - 示例:
@Configuration public class AppConfig { @Bean public DataSource dataSource() { // 配置数据源 } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } }
8. Utility 层(工具类层)
- 作用:提供一些通用的工具类,用于简化业务代码的实现,通常包括日期、字符串、文件等常见操作。
- 职责:提供一些静态方法,避免在各层中重复编写相似的代码。
- 示例:
public class DateUtil { public static String formatDate(LocalDate date) { // 格式化日期 } }
常见的分层架构结构:
com.example.project
│
├── controller # 控制器层(Web 层)
│ └── UserController.java
│
├── service # 业务逻辑层
│ └── UserService.java
│
├── repository # 持久层
│ └── UserRepository.java
│
├── entity # 实体层
│ └── User.java
│
├── dto # 数据传输对象
│ └── UserDTO.java
│
├── exception # 异常处理层
│ └── GlobalExceptionHandler.java
│
├── config # 配置层
│ └── AppConfig.java
│
├── util # 工具类
│ └── DateUtil.java
│
└── Application.java # 启动类