一篇Spring Boot 笔记
一、Spring Boot 简介
Spring Boot 是一个用于创建独立的、基于 Spring 的生产级应用程序的框架。它简化了 Spring 应用的初始搭建和开发过程,通过自动配置等功能,让开发者能够快速地构建应用,减少了大量的样板代码和复杂的配置。
二、核心特性
(一)自动配置
- 原理
Spring Boot 根据类路径中的依赖自动配置 Spring 应用上下文。它使用条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean等)来决定是否需要配置某个组件。例如,如果spring - boot - starter - web在类路径中,并且没有自定义的Servlet相关配置,Spring Boot 会自动配置一个嵌入式的 Web 服务器(如 Tomcat),并配置好Spring MVC的相关组件。 - 优点
极大地减少了手动配置的工作量。以前在 Spring 应用中,需要手动配置很多组件,如数据源、事务管理器等,而在 Spring Boot 中,只要添加相应的依赖,就可以自动完成大部分配置。
(二)起步依赖(Starter Dependencies)
- 概念
Spring Boot 提供了一系列的 “starter” 依赖,这些依赖将常用的功能相关的库整合在一起。例如,spring - boot - starter - web包含了构建 Web 应用所需的 Spring MVC、嵌入式 Web 服务器等相关依赖。开发者只需要在pom.xml(Maven 项目)或build.gradle(Gradle 项目)中添加所需的 starter 依赖,就可以快速引入功能,而无需关心具体需要哪些库。 - 使用示例
在pom.xml中添加spring - boot - starter - data - jpa依赖,就可以在项目中方便地使用 JPA(Java Persistence API)进行数据库访问,无需手动添加 Hibernate 等相关依赖。
(三)内置服务器
Spring Boot 默认支持嵌入式的 Web 服务器,如 Tomcat、Jetty 或 Undertow。可以在application.properties或application.yml中轻松配置服务器的端口、上下文路径等属性。例如,server.port = 8080可以设置应用运行的端口。
三、配置文件
(一)两种格式
- application.properties
这是一种传统的键值对形式的配置文件。例如:spring.datasource.url = jdbc:mysql://localhost:3306/mydb用于配置数据源的 URL。 - application.yml(或 application.yaml)
这是一种更具可读性的、基于 YAML 语法的配置文件,具有层次结构。例如:
yaml:
spring:datasource:url: jdbc:mysql://localhost:3306/mydb
(二)属性注入
- @Value 注解
可以将配置文件中的属性值注入到 Java 类的字段中。例如:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MyConfig {@Value("${myapp.name}")private String appName;// 可以在类的其他方法中使用 appName
}
- @ConfigurationProperties 注解
用于将配置文件中的一组相关属性绑定到一个 Java 类上。例如,配置文件中有以下内容:
myapp:database:host: localhostport: 3306username: rootpassword: password
可以创建一个 Java 类:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties("myapp.database")
public class DatabaseConfig {private String host;private int port;private String username;private String password;// 生成相应的getter和setter方法
}
四、Web 开发
(一)创建 RESTful API
- 使用 @RestController 注解
@RestController是一个组合了@Controller和@ResponseBody功能的注解。在一个被@RestController标注的类中,可以使用@GetMapping、@PostMapping、@PutMapping、@DeleteMapping等注解来处理不同类型的 HTTP 请求。例如:
import org.springframework.web.bind.annotation.*;@RestController
public class UserController {@GetMapping("/users")public List<User> getUsers() {// 返回用户列表的逻辑return userService.getUsers();}@PostMapping("/users")public User createUser(@RequestBody User user) {// 创建用户的逻辑return userService.createUser(user);}
}
- 处理请求参数
- @RequestParam:用于获取 URL 中的查询参数。例如,
/users?id=1,可以在方法中使用@RequestParam("id") Integer id来获取参数值。 - @PathVariable:用于获取 URL 路径中的参数。例如,
/users/{id},可以在方法中使用@PathVariable("id") Integer id来获取参数值。
- @RequestParam:用于获取 URL 中的查询参数。例如,
(二)视图模板(可选)
如果需要开发传统的 Web 页面,可以集成视图模板引擎,如 Thymeleaf、FreeMarker 等。以 Thymeleaf 为例,需要在pom.xml中添加spring - boot - starter - thymeleaf依赖,然后在src/main/resources/templates目录下创建 HTML 模板文件,在模板文件中可以使用 Thymeleaf 的语法来绑定数据和进行逻辑判断等。
五、数据库访问
(一)JPA(Java Persistence API)
- 实体类定义
使用@Entity注解标记一个 Java 类为实体类,表示它与数据库中的表对应。例如:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;// 生成相应的getter和setter方法
}
- 数据访问接口
可以通过继承JpaRepository接口来实现基本的数据库操作。例如:
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {// 可以在这里定义自定义的查询方法(可选)
}
(二)数据库连接配置
在application.properties或application.yml中配置数据库连接信息,包括 URL、用户名、密码、驱动等。例如,对于 MySQL 数据库:
properties:
spring.datasource.url = jdbc:mysql://localhost:3306/mydb
spring.datasource.username = root
spring.datasource.password = password
spring.datasource.driver - class - name = com.mysql.cdriver
六、测试
(一)单元测试
使用 JUnit 等测试框架结合 Spring Boot 的测试支持进行单元测试。可以使用@SpringBootTest注解启动整个 Spring 应用上下文,使用@MockBean注解模拟依赖的组件。例如:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import static org.mockito.Mockito.*;@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;@MockBeanprivate UserRepository userRepository;@Testpublic void testGetUsers() {when(userRepository.findAll()).thenReturn(Arrays.asList(new User()));List<User> users = userService.getUsers();assertEquals(1, users.size());verify(userRepository, times(1)).findAll();}
}
(二)集成测试
通过@SpringBootTest注解启动整个应用,测试不同组件之间的交互。例如,测试UserController与UserService之间的数据传递和业务逻辑执行是否正确。
七、实际用例:简单的员工管理系统
(一)需求分析
- 实现一个简单的员工管理系统,能够进行员工信息的查询、添加、更新和删除操作。
- 提供 RESTful API 供前端应用或其他后端服务调用。
- 将员工信息存储在数据库中。
(二)技术选型
- 使用 Spring Boot 构建后端应用。
- 使用 MySQL 数据库存储数据。
- 使用 Spring Data JPA 进行数据库访问。
- 构建 RESTful API 使用
@RestController和相关的请求映射注解。
(三)实现步骤
- 创建 Spring Boot 项目
- 使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加
spring - boot - starter - web和spring - boot - starter - data - jpa依赖,以及 MySQL 数据库驱动依赖。
- 使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加
- 定义实体类
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class Employee {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String department;private double salary;// 生成getter和setter方法
}
- 创建数据访问接口
import org.springframework.data.jpa.repository.JpaRepository;public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
- 创建服务层
import org.springframework.stereotype.Service;
import java.util.List;@Service
public class EmployeeService {private final EmployeeRepository employeeRepository;public EmployeeService(EmployeeRepository employeeRepository) {this.employeeRepository = employeeRepository;}public List<Employee> getEmployees() {return employeeRepository.findAll();}public Employee getEmployeeById(Long id) {return employeeRepository.findById(id).orElse(null);}public Employee saveEmployee(Employee employee) {return employeeRepository.save(employee);}public void deleteEmployee(Long id) {employeeRepository.deleteById(id);}
}
- 创建控制器
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;@RestController
@RequestMapping("/employees")
public class EmployeeController {private final EmployeeService employeeService;public EmployeeController(EmployeeService employeeService) {this.employeeService = employeeService;}@GetMappingpublic ResponseEntity<List<Employee>> getEmployees() {List<Employee> employees = employeeService.getEmployees();return new ResponseEntity<>(employees, HttpStatus.OK);}@GetMapping("/{id}")public ResponseEntity<Employee> getEmployeeById(@PathVariable Long id) {Employee employee = employeeService.getEmployeeById(id);if (employee!= null) {return new ResponseEntity<>(employee, HttpStatus.OK);}return new ResponseEntity<>(HttpStatus.NOT_FOUND);}@PostMappingpublic ResponseEntity<Employee> createEmployee(@RequestBody Employee employee) {Employee savedEmployee = employeeService.saveEmployee(employee);return new ResponseEntity<>(savedEmployee, HttpStatus.CREATED);}@PutMapping("/{id}")public ResponseEntity<Employee> updateEmployee(@PathVariable Long id, @RequestBody Employee employee) {if (employeeService.getEmployeeById(id)!= null) {employee.setId(id);Employee updatedEmployee = employeeService.saveEmployee(employee);return new ResponseEntity<>(updatedEmployee, HttpStatus.OK);}return new ResponseEntity<>(HttpStatus.NOT_FOUND);}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteEmployee(@PathVariable Long id) {if (employeeService.getEmployeeById(id)!= null) {employeeService.deleteEmployee(id);return new ResponseEntity<>(HttpStatus.NO_CONTENT);}return new ResponseEntity<>(HttpStatus.NOT_FOUND);}
}
- 配置数据库连接
在application.properties中配置 MySQL 数据库连接信息:
spring.datasource.url = jdbc:mysql://localhost:3306/companydb
spring.datasource.username = root
spring.datasource.password = password
spring.datasource.driver - class - name = com.mysql.cdriver
- 测试应用
- 可以使用 Postman 等工具来测试创建的 RESTful API。例如,发送 GET 请求到
/employees可以获取所有员工信息,发送 POST 请求到/employees并在请求体中包含员工信息可以创建新员工等。同时,可以编写单元测试和集成测试来确保各个组件的功能正确性。
- 可以使用 Postman 等工具来测试创建的 RESTful API。例如,发送 GET 请求到
相关文章:
一篇Spring Boot 笔记
一、Spring Boot 简介 Spring Boot 是一个用于创建独立的、基于 Spring 的生产级应用程序的框架。它简化了 Spring 应用的初始搭建和开发过程,通过自动配置等功能,让开发者能够快速地构建应用,减少了大量的样板代码和复杂的配置。 二、核心特…...
一生一芯 预学习阶段 NEMU代码学习(2)
接上回:一生一芯 预学习阶段 NEMU代码学习(1) 上次说到这里 static int cmd_c(char *args) {cpu_exec(-1);return 0; } 当输入c时,会执行:cpu_exec(-1); void cpu_exec(uint64_t n) {g_print_step (n < MAX_IN…...
《手写Spring渐进式源码实践》实践笔记(第二十章 实现简单ORM框架)
文章目录 第二十章 简单ORM框架实现背景技术背景基本概念工作原理优点缺点常见的ORM框架 业务背景 目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件测试用例(selectOne)测试结果测试用例(selectList)测试结果 总结 第二十章 简单ORM框架实现 背景 技术背景 ORM&…...
AI技术赋能电商行业:创新应用与未来展望
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《热点时事》 期待您的关注 引言 随着科技的飞速发展,人工智能(AI)技术正逐步渗透到各行各业&a…...
windows 11编译安装ffmpeg(包含ffplay)
一、源码及安装包下载 1.1,ffmpeg源码包下载 下载地址:Download FFmpeg 1.2,mysys下载 下载地址:MSYS2 1.3,libx264源码包下载 下载地址:x264, the best H.264/AVC encoder - VideoLAN 二、软件安装 2.1&…...
系统启动时将自动加载环境变量,并后台启动 MinIO、Nacos 和 Redis 服务
服务器信息 服务器 IP:192.168.1.44服务器用户:changzhou用户密码:XXXXXXXX Nacos 数据库用户信息: 账号:cz_nacos密码:XXXXXXXX Nacos 内网地址:http://192.168.1.44:8848/nacos 账号&#x…...
[ACTF2020 新生赛]Upload 1--详细解析
信息收集 题目告诉我们是一道upload,也就是文件上传漏洞题目。 进入界面,是一个灯泡,将鼠标放在图标上就会出现文件上传的相应位置: 思路 文件上传漏洞,先看看有没有前端校验。 在js源码中找到了前端校验ÿ…...
power bi中的related函数解析
在Power BI中,RELATED函数是一种用于检索相关表中数据的函数。它用于在一个表中检索与当前行相关联的另一个表中的数据。 销售成本 [销售数量]*related(商品表[进价])...
目前区块链服务商备案支持的区块链技术类型
status"success"data1-name"比特币/Bitcoin/BTC"3-name"以太坊/Ethereum/ETH"875-name"超级账本/Hyperledger"5-name"柚子/EOS/EOS"6-name"恒星链/Stellar/XLM"1055-name"Quorum"7-name"莱特币/Li…...
CatBoost中的预测偏移和排序提升
在 CatBoost 中,预测偏移(Prediction Shift) 和 排序提升(Ordered Boosting) 是其关键概念和创新点。CatBoost 通过引入 排序提升 解决了梯度提升决策树(GBDT)算法中常见的 预测偏移问题&#x…...
python: postgreSQL using psycopg2 or psycopg
psycopg2 # encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 許可資訊查看:言語成了邀功的功臣,還需要行爲每日來值班嗎? # 描述: pip install --upgrade pip PostgreSQL database adapter for Python # pip install…...
从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
🎯 从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化 🔎 引言 随着 MySQL 的不断升级,从 5.7 到 8.0,不仅性能得到提升,其对 SQL 标准的严格执行也显著提高。GROUP BY 的行为变化就是一个典型例子。…...
npm完整发包流程(亲测可验证)
1. 准备工作 (1) 在npm官网上注册一个账号 (2) 注册成功之后,npm会发送一封邮件给你,点击邮件里面的链接,做确认关联操作(必需) 2. 创建自己的npm包 (…...
学习threejs,使用JSON格式保存和加载模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE toJSON()方法 二、&a…...
中国首部《能源法》正式问世,它的亮点有哪些呢?
2024年11月8日,《中华人民共和国能源法》经十四届全国人大常委会第十二次会议审议通过,正式出台,将于明年1月1日起施行。 中国首部《能源法》正式问世,它的亮点有哪些呢? 一、填补立法空白,完善能源法律体…...
【外包】软件行业的原始形态,项目外包与独立开发者
【外包】互联网软件行业的原始形态,项目外包与独立开发者 本科期间写的一些东西,最近整理东西看到了,大致整理一下放出来,部分内容来自其他文章,均已引用。 文章目录 1、互联网软件行业的原始形态2、项目订单ÿ…...
工程数学线性代数(同济第七版)附册课后习题答案PDF
《线性代数附册 学习辅导与习题全解》是与同济大学数学科学学院编《工程数学 线性代数》第七版教材配套的教学辅导书,由同济大学作者团队根据教材内容和要求编写而成。本书在《工程数学 线性代数》第六版附册(即辅导书)的基础上修改而成。全书…...
【Ubuntu24.04】部署服务(基础)
目录 0 背景1 设置静态IP2 连接服务器3 部署服务3.1 安装JDK3.2 下载并安装MySQL8.43.2.1 从官网下载 APT Repository 配置文件3.2.2 安装 MySQL8.43.2.3 配置远程连接 3.3 下载并配置Redis3.4 上传jar包并部署应用3.5 开放端口 4 总结 0 背景 在成功安装了Ubuntu24.04操作系统…...
Linux符号使用记录
~ 账户 home 目录,如果是 root 账户就是 /root . 当前目录 .. 上层目录 | 管道符 & 后台工作,放在完整指令列的最后端,表示将该指令列放入后台中工作。 > 输出重定向,重新…...
初阶C++之C++入门基础
大家好!欢迎来到C篇学习,这篇文章的内容不会很难,为c的引入,c的重点内容将在第二篇的文章中讲解,届时难度会陡然上升,请做好准备! 我们先看网络上的一个梗:21天内⾃学精通C 好了&am…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
