Spring Boot 项目——分层架构

在创建一个 Spring Boot 项目时,为了提高代码的可维护性、可扩展性和清晰度,通常会按照一定的分层架构进行设计。常见的分层架构包括以下几层:

1. Controller 层(Web 层)

  • 作用:接收用户请求,并调用相应的业务逻辑,最终返回视图或数据。

  • 职责:处理 HTTP 请求,调用 Service 层来执行业务逻辑,然后将结果返回给客户端。通常,Controller 层与前端直接交互。

  • 组件 :Spring MVC 中的 @RestController@Controller 注解。

  • 示例

    java 复制代码
    @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 注解。

  • 示例

    java 复制代码
    @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 注解,或者继承 JpaRepositoryCrudRepository 等接口。

  • 示例

    java 复制代码
    @Repository
    public interface UserRepository extends JpaRepository<User, Integer> {
        // JpaRepository 提供了基本的 CRUD 操作
    }

4. Entity 层(实体层)

  • 作用:表示数据库中的一张表,映射到 Java 类中。实体类通常包含表中的字段及对应的 getter 和 setter 方法。

  • 职责:定义数据库表的结构。它通常包含属性、构造函数、getter 和 setter 方法,可能还会有一些业务逻辑(如验证)或其他注解(如验证注解)。

  • 组件 :JPA 实体类使用 @Entity@Table@Id 等注解。

  • 示例

    java 复制代码
    @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 和实体类类似,但通常会避免直接暴露实体类的敏感信息。

  • 示例

    java 复制代码
    public class UserDTO {
        private Integer id;
        private String userName;
        private String userRegisterTime;
        
        // getters and setters
    }

6. Exception 层(异常处理层)

  • 作用:集中管理异常,捕获并处理应用程序中的各种异常。

  • 职责 :处理应用程序中的业务异常和系统异常。通常使用 @ControllerAdvice@ExceptionHandler 来全局处理异常,并返回友好的错误信息给用户。

  • 组件@ControllerAdvice 注解。

  • 示例

    java 复制代码
    @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 注解。

  • 示例

    java 复制代码
    @Configuration
    public class AppConfig {
        
        @Bean
        public DataSource dataSource() {
            // 配置数据源
        }
        
        @Bean
        public JdbcTemplate jdbcTemplate(DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    }

8. Utility 层(工具类层)

  • 作用:提供一些通用的工具类,用于简化业务代码的实现,通常包括日期、字符串、文件等常见操作。

  • 职责:提供一些静态方法,避免在各层中重复编写相似的代码。

  • 示例

    java 复制代码
    public class DateUtil {
        public static String formatDate(LocalDate date) {
            // 格式化日期
        }
    }

常见的分层架构结构:

bash 复制代码
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  # 启动类
相关推荐
匠在江湖10 分钟前
裸机单片机任务调度器实现:基于规范分层(COM/APP/SRV/DRV)架构,(附 任务调度器 / 微秒延时函数 / 串口重定向 源码)
单片机·嵌入式硬件·架构
栈与堆19 分钟前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
gaize121321 分钟前
服务器怎么选择与配置才能满足企业需求?
运维·服务器·架构
加个鸡腿儿33 分钟前
经验分享2:SSR 项目中响应式组件的闪动陷阱与修复实践
前端·css·架构
OC溥哥99934 分钟前
Paper MinecraftV3.0重大更新(下界更新)我的世界C++2D版本隆重推出,拷贝即玩!
java·c++·算法
星火开发设计37 分钟前
C++ map 全面解析与实战指南
java·数据结构·c++·学习·算法·map·知识
*才华有限公司*40 分钟前
RTSP视频流播放系统
java·git·websocket·网络协议·信息与通信
gelald1 小时前
ReentrantLock 学习笔记
java·后端
计算机学姐1 小时前
基于SpringBoot的校园资源共享系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·spring·信息可视化
一条咸鱼_SaltyFish1 小时前
[Day15] 若依框架二次开发改造记录:定制化之旅 contract-security-ruoyi
java·大数据·经验分享·分布式·微服务·架构·ai编程