Spring Boot 项目——分层架构
在创建一个 Spring Boot 项目时,为了提高代码的可维护性、可扩展性和清晰度,通常会按照一定的分层架构进行设计。常见的分层架构包括以下几层:
1. Controller 层(Web 层)
- 作用:接收用户请求,并调用相应的业务逻辑,最终返回视图或数据。
- 职责:处理 HTTP 请求,调用 Service 层来执行业务逻辑,然后将结果返回给客户端。通常,Controller 层与前端直接交互。
- 组件:Spring MVC 中的
@RestController
或@Controller
注解。 - 示例:
@RestController @RequestMapping("/api/users") public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User getUserById(@PathVariable Integer id) {return userService.getUserById(id);}@PostMappingpublic User createUser(@RequestBody User user) {return userService.createUser(user);} }
2. Service 层(业务逻辑层)
- 作用:处理业务逻辑,通常是 Controller 层和 Repository 层之间的纽带。
- 职责:包含具体的业务处理代码,如数据验证、数据加工、调度等。Service 层不直接处理 HTTP 请求,而是处理具体的业务逻辑,通常依赖于 DAO 层来访问数据库。
- 组件:
@Service
注解。 - 示例:
@Service public class UserService {@Autowiredprivate 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 {@Beanpublic DataSource dataSource() {// 配置数据源}@Beanpublic 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 # 启动类
相关文章:
Spring Boot 项目——分层架构
在创建一个 Spring Boot 项目时,为了提高代码的可维护性、可扩展性和清晰度,通常会按照一定的分层架构进行设计。常见的分层架构包括以下几层: 1. Controller 层(Web 层) 作用:接收用户请求,并…...

wordpress网站首页底部栏显示网站备案信息
一、页脚文件footer.php 例如,wordpress主题使用的是simple-life主题,服务器IP为192.168.68.89,在wordpress主题文件中有个页脚文件footer.php,这是一个包含网站页脚代码的文件。 footer.php 路径如下: /www/wwwroot/192.168.68…...
python面向对象编程练习
学生成绩管理系统 定义一个Student类,包括属性(姓名、成绩)和方法(设置成绩、获取成绩、计算平均成绩)。 实例化多个学生对象并调用方法。 功能说明: Student 类: init(self, name):…...

OpenCV_Code_LOG
孔洞填充 void fillHole(const Mat srcBw, Mat &dstBw) {Size m_Size srcBw.size();Mat TempMat::zeros(m_Size.height2,m_Size.width2,srcBw.type());//延展图像srcBw.copyTo(Temp(Range(1, m_Size.height 1), Range(1, m_Size.width 1)));cv::floodFill(Temp, Point(…...
力扣第 74 题是 搜索二维矩阵
题目描述 给定一个 m x n 的矩阵 matrix 和一个目标值 target,请你编写一个函数来判断目标值 target 是否在矩阵中。 每行的元素按升序排列。每列的元素按升序排列。 示例 1 输入: matrix [[1, 4, 7, 11],[2, 5, 8, 12],[3, 6, 9, 16],[10, 13, 14…...

[极客大挑战 2019]BabySQL--详细解析
信息搜集 进入界面: 输入用户名为admin,密码随便输一个: 发现是GET传参,有username和password两个传参点。 我们测试一下password点位能不能注入: 单引号闭合报错,根据报错信息,我们可以判断…...

实现Linux平台自定义协议族
一 简介 我们常常在Linux系统中编写socket接收TCP/UDP协议数据,大家有没有想过它怎么实现的,如果我们要实现socket接收自定义的协议数据又该怎么做呢?带着这个疑问,我们一起往下看吧~~ 二 Linux内核函数简介 在Linux系统中要想…...

RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程
这是一篇基于RL78/G15 Fast Prototyping Board的Arduino IDE开发记录 RL78/G15 Fast Prototyping Board硬件简介(背景)基础测试(方法说明/操作说明)开发环境搭建(方法说明/操作说明代码结果)Arduino IDE RL…...

YOLOv11 NCNN安卓部署
YOLOv11 NCNN安卓部署 前言 yolov11 NCNN安卓部署 目前的帧率可以稳定在20帧左右,下面是这个项目的github地址:https://github.com/gaoxumustwin/ncnn-android-yolov11 上面的检测精度很低时因为这个模型只训练了5个epoch,使用3090训练一个…...
对载入的3dtiles进行旋转、平移和缩放变换。
使用 params: {tx: 129.75845, //模型中心X轴坐标(经度,单位:十进制度)//小左ty: 46.6839, //模型中心Y轴坐标(纬度,单位:十进制度)//小下tz: 28, //模型中心Z轴坐标(高…...
Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言
本人使用C开发8年、C#开发15年、中间使用JAVA开发过项目、后期在学习过程中发现了Rust语言说它是最安全的语言,能够解决C、C的痛点、于是抽出一部分时间网上买书,看网上资料进行学习,这一学习起来发现和其它语言比较起来,在编码的…...

在openEuler中使用top命令
在openEuler中使用top命令 概述 top 命令是Linux系统中最常用的实时性能监控工具之一,允许用户查看系统的整体状态,包括CPU使用率、内存使用情况、运行中的进程等。本文档将详细介绍如何在openEuler操作系统中有效利用top命令进行系统监控。 启动top命令 打开终端并输入t…...

探索文件系统,Python os库是你的瑞士军刀
文章目录 探索文件系统,Python os库是你的瑞士军刀第一部分:背景介绍第二部分:os库是什么?第三部分:如何安装os库?第四部分:简单库函数使用方法1. 获取当前工作目录2. 改变当前工作目录3. 列出目…...

【小白学机器学习41】如何从正态分布的总体中去抽样? 获得指定正态分布的样本的2种方法
目录 1 目标:使用2种方法,去从正态分布的总体中去抽样,获得样本 1.1 step1: 首先,逻辑上需要先有符合正态分布的总体population 1.2 从总体中取得样本,模拟抽样的过程 2 从正态分布抽样的方法1 3 从正态分布抽样…...
将VSCode设置成中文语言环境
目录 VSCode默认是英文语言环境,这对于像我这种英语比较菜的人来说不是那么友好 另外也习惯了用中文,所以接下来介绍下如何将VSCode设置成中文语言环境。 1、打开VSCode软件,按快捷键【CtrlShiftP】 2、在弹出的搜索框中输入【configure l…...

Applied Intelligence投稿
一、关于手稿格式: 1、该期刊是一个二区的,模板使用Springer nature格式, 期刊投稿要求,详细期刊投稿指南,大部分按Soringernature模板即可,图片表格声明参考文献命名要求需注意。 2、参考文献ÿ…...

AI-agent矩阵营销:让品牌传播无处不在
矩阵营销是一种通过多平台联动构建品牌影响力的策略,而 AI-agent 技术让这一策略变得更加智能化。AI社媒引流王凭借其矩阵管理功能,帮助品牌在多个平台上实现深度覆盖与精准传播。 1. 矩阵营销的优势 品牌触达更广:多平台联动可以覆盖不同用…...

【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)
1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…...

NSSCTF-做题笔记
[羊城杯 2020]easyre 查壳,无壳,64位,ida打开 encode_one encode_tow encode_three 那么我们开始一步一步解密,从最外层开始 def decode_three(encrypted_str):decrypted_str ""for char in encrypted_str:char_code …...

【小白学机器学习35】数据表:整洁数据表,交叉表/列联表,以及两者转化pd.pivot_table()
目录 1 虽然这是个很基础的知识,但是我觉得有必要记录下 2 整洁数据表 3 交叉数据表的2种形式 3.0 交叉表的名字 3.1 2维的交叉表 3.2 用2维表现3维的 3.3 上述内容,具体的markdown文本 4 交叉数据表 4.1 交叉数据表并不整洁 4.2 但是交叉表也…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...