当前位置: 首页 > news >正文

一篇Spring Boot 笔记

一、Spring Boot 简介

Spring Boot 是一个用于创建独立的、基于 Spring 的生产级应用程序的框架。它简化了 Spring 应用的初始搭建和开发过程,通过自动配置等功能,让开发者能够快速地构建应用,减少了大量的样板代码和复杂的配置。

二、核心特性

(一)自动配置

  1. 原理
    Spring Boot 根据类路径中的依赖自动配置 Spring 应用上下文。它使用条件注解(如@ConditionalOnClass@ConditionalOnMissingBean等)来决定是否需要配置某个组件。例如,如果spring - boot - starter - web在类路径中,并且没有自定义的Servlet相关配置,Spring Boot 会自动配置一个嵌入式的 Web 服务器(如 Tomcat),并配置好Spring MVC的相关组件。
  2. 优点
    极大地减少了手动配置的工作量。以前在 Spring 应用中,需要手动配置很多组件,如数据源、事务管理器等,而在 Spring Boot 中,只要添加相应的依赖,就可以自动完成大部分配置。

(二)起步依赖(Starter Dependencies)

  1. 概念
    Spring Boot 提供了一系列的 “starter” 依赖,这些依赖将常用的功能相关的库整合在一起。例如,spring - boot - starter - web包含了构建 Web 应用所需的 Spring MVC、嵌入式 Web 服务器等相关依赖。开发者只需要在pom.xml(Maven 项目)或build.gradle(Gradle 项目)中添加所需的 starter 依赖,就可以快速引入功能,而无需关心具体需要哪些库。
  2. 使用示例
    pom.xml中添加spring - boot - starter - data - jpa依赖,就可以在项目中方便地使用 JPA(Java Persistence API)进行数据库访问,无需手动添加 Hibernate 等相关依赖。

(三)内置服务器

Spring Boot 默认支持嵌入式的 Web 服务器,如 Tomcat、Jetty 或 Undertow。可以在application.propertiesapplication.yml中轻松配置服务器的端口、上下文路径等属性。例如,server.port = 8080可以设置应用运行的端口。

三、配置文件

(一)两种格式

  1. application.properties
    这是一种传统的键值对形式的配置文件。例如:spring.datasource.url = jdbc:mysql://localhost:3306/mydb用于配置数据源的 URL。
  2. application.yml(或 application.yaml)
    这是一种更具可读性的、基于 YAML 语法的配置文件,具有层次结构。例如:

yaml:

spring:datasource:url: jdbc:mysql://localhost:3306/mydb

(二)属性注入

  1. @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
}

  1. @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

  1. 使用 @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);}
}

  1. 处理请求参数
    • @RequestParam:用于获取 URL 中的查询参数。例如,/users?id=1,可以在方法中使用@RequestParam("id") Integer id来获取参数值。
    • @PathVariable:用于获取 URL 路径中的参数。例如,/users/{id},可以在方法中使用@PathVariable("id") Integer id来获取参数值。

(二)视图模板(可选)

如果需要开发传统的 Web 页面,可以集成视图模板引擎,如 Thymeleaf、FreeMarker 等。以 Thymeleaf 为例,需要在pom.xml中添加spring - boot - starter - thymeleaf依赖,然后在src/main/resources/templates目录下创建 HTML 模板文件,在模板文件中可以使用 Thymeleaf 的语法来绑定数据和进行逻辑判断等。

五、数据库访问

(一)JPA(Java Persistence API)

  1. 实体类定义
    使用@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方法
}

  1. 数据访问接口
    可以通过继承JpaRepository接口来实现基本的数据库操作。例如:
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {// 可以在这里定义自定义的查询方法(可选)
}

(二)数据库连接配置

application.propertiesapplication.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注解启动整个应用,测试不同组件之间的交互。例如,测试UserControllerUserService之间的数据传递和业务逻辑执行是否正确。

七、实际用例:简单的员工管理系统

(一)需求分析

  1. 实现一个简单的员工管理系统,能够进行员工信息的查询、添加、更新和删除操作。
  2. 提供 RESTful API 供前端应用或其他后端服务调用。
  3. 将员工信息存储在数据库中。

(二)技术选型

  1. 使用 Spring Boot 构建后端应用。
  2. 使用 MySQL 数据库存储数据。
  3. 使用 Spring Data JPA 进行数据库访问。
  4. 构建 RESTful API 使用@RestController和相关的请求映射注解。

(三)实现步骤

  1. 创建 Spring Boot 项目
    • 使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加spring - boot - starter - webspring - boot - starter - data - jpa依赖,以及 MySQL 数据库驱动依赖。
  2. 定义实体类
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方法
}

  1. 创建数据访问接口
import org.springframework.data.jpa.repository.JpaRepository;public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}

  1. 创建服务层
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);}
}

  1. 创建控制器
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);}
}

  1. 配置数据库连接
    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

  1. 测试应用
    • 可以使用 Postman 等工具来测试创建的 RESTful API。例如,发送 GET 请求到/employees可以获取所有员工信息,发送 POST 请求到/employees并在请求体中包含员工信息可以创建新员工等。同时,可以编写单元测试和集成测试来确保各个组件的功能正确性。

相关文章:

一篇Spring Boot 笔记

一、Spring Boot 简介 Spring Boot 是一个用于创建独立的、基于 Spring 的生产级应用程序的框架。它简化了 Spring 应用的初始搭建和开发过程&#xff0c;通过自动配置等功能&#xff0c;让开发者能够快速地构建应用&#xff0c;减少了大量的样板代码和复杂的配置。 二、核心特…...

一生一芯 预学习阶段 NEMU代码学习(2)

接上回&#xff1a;一生一芯 预学习阶段 NEMU代码学习&#xff08;1&#xff09; 上次说到这里 static int cmd_c(char *args) {cpu_exec(-1);return 0; } 当输入c时&#xff0c;会执行&#xff1a;cpu_exec(-1); void cpu_exec(uint64_t n) {g_print_step (n < MAX_IN…...

《手写Spring渐进式源码实践》实践笔记(第二十章 实现简单ORM框架)

文章目录 第二十章 简单ORM框架实现背景技术背景基本概念工作原理优点缺点常见的ORM框架 业务背景 目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件测试用例(selectOne)测试结果测试用例(selectList)测试结果 总结 第二十章 简单ORM框架实现 背景 技术背景 ORM&…...

AI技术赋能电商行业:创新应用与未来展望

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐步渗透到各行各业&a…...

windows 11编译安装ffmpeg(包含ffplay)

一、源码及安装包下载 1.1&#xff0c;ffmpeg源码包下载 下载地址&#xff1a;Download FFmpeg 1.2&#xff0c;mysys下载 下载地址&#xff1a;MSYS2 1.3&#xff0c;libx264源码包下载 下载地址&#xff1a;x264, the best H.264/AVC encoder - VideoLAN 二、软件安装 2.1&…...

系统启动时将自动加载环境变量,并后台启动 MinIO、Nacos 和 Redis 服务

服务器信息 服务器 IP&#xff1a;192.168.1.44服务器用户&#xff1a;changzhou用户密码&#xff1a;XXXXXXXX Nacos 数据库用户信息&#xff1a; 账号&#xff1a;cz_nacos密码&#xff1a;XXXXXXXX Nacos 内网地址&#xff1a;http://192.168.1.44:8848/nacos 账号&#x…...

[ACTF2020 新生赛]Upload 1--详细解析

信息收集 题目告诉我们是一道upload&#xff0c;也就是文件上传漏洞题目。 进入界面&#xff0c;是一个灯泡&#xff0c;将鼠标放在图标上就会出现文件上传的相应位置&#xff1a; 思路 文件上传漏洞&#xff0c;先看看有没有前端校验。 在js源码中找到了前端校验&#xff…...

power bi中的related函数解析

在Power BI中&#xff0c;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 中&#xff0c;预测偏移&#xff08;Prediction Shift&#xff09; 和 排序提升&#xff08;Ordered Boosting&#xff09; 是其关键概念和创新点。CatBoost 通过引入 排序提升 解决了梯度提升决策树&#xff08;GBDT&#xff09;算法中常见的 预测偏移问题&#x…...

python: postgreSQL using psycopg2 or psycopg

psycopg2 # encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 許可資訊查看&#xff1a;言語成了邀功的功臣&#xff0c;還需要行爲每日來值班嗎&#xff1f; # 描述&#xff1a; pip install --upgrade pip PostgreSQL database adapter for Python # pip install…...

从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112

&#x1f3af; 从 MySQL 5.7 到 8.0&#xff1a;理解 GROUP BY 的新规则与实战优化 &#x1f50e; 引言 随着 MySQL 的不断升级&#xff0c;从 5.7 到 8.0&#xff0c;不仅性能得到提升&#xff0c;其对 SQL 标准的严格执行也显著提高。GROUP BY 的行为变化就是一个典型例子。…...

npm完整发包流程(亲测可验证)

1. 准备工作 &#xff08;1&#xff09; 在npm官网上注册一个账号 &#xff08;2&#xff09; 注册成功之后&#xff0c;npm会发送一封邮件给你&#xff0c;点击邮件里面的链接&#xff0c;做确认关联操作&#xff08;必需&#xff09; 2. 创建自己的npm包 &#xff08;…...

学习threejs,使用JSON格式保存和加载模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE toJSON()方法 二、&a…...

中国首部《能源法》正式问世,它的亮点有哪些呢?

2024年11月8日&#xff0c;《中华人民共和国能源法》经十四届全国人大常委会第十二次会议审议通过&#xff0c;正式出台&#xff0c;将于明年1月1日起施行。 中国首部《能源法》正式问世&#xff0c;它的亮点有哪些呢&#xff1f; 一、填补立法空白&#xff0c;完善能源法律体…...

【外包】软件行业的原始形态,项目外包与独立开发者

【外包】互联网软件行业的原始形态&#xff0c;项目外包与独立开发者 本科期间写的一些东西&#xff0c;最近整理东西看到了&#xff0c;大致整理一下放出来&#xff0c;部分内容来自其他文章&#xff0c;均已引用。 文章目录 1、互联网软件行业的原始形态2、项目订单&#xff…...

工程数学线性代数(同济第七版)附册课后习题答案PDF

《线性代数附册 学习辅导与习题全解》是与同济大学数学科学学院编《工程数学 线性代数》第七版教材配套的教学辅导书&#xff0c;由同济大学作者团队根据教材内容和要求编写而成。本书在《工程数学 线性代数》第六版附册&#xff08;即辅导书&#xff09;的基础上修改而成。全书…...

【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 目录&#xff0c;如果是 root 账户就是 /root . 当前目录 .. 上层目录 | 管道符 & 后台工作&#xff0c;放在完整指令列的最后端&#xff0c;表示将该指令列放入后台中工作。 > 输出重定向&#xff0c;重新…...

初阶C++之C++入门基础

大家好&#xff01;欢迎来到C篇学习&#xff0c;这篇文章的内容不会很难&#xff0c;为c的引入&#xff0c;c的重点内容将在第二篇的文章中讲解&#xff0c;届时难度会陡然上升&#xff0c;请做好准备&#xff01; 我们先看网络上的一个梗&#xff1a;21天内⾃学精通C 好了&am…...

太方便了!农村自建房设计新神器,二三维设计 + 扫码看模型

还在为农村自建房设计发愁&#xff1f;手绘图纸看不懂、修改慢、施工易出错&#xff1f;飞扬集成设计系统&#xff0c;专为农村自建房打造&#xff0c;一键实现二三维一体化设计&#xff0c;还能扫码查看轻量化 3D 模型&#xff0c;让建房更高效、更直观、更省心&#xff01;一…...

5个Windows运行Android应用方案测评:普通用户的轻量级跨平台解决方案

5个Windows运行Android应用方案测评&#xff1a;普通用户的轻量级跨平台解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在数字化办公与娱乐日益融合的今天&am…...

幻兽帕鲁存档迁移完全手册:告别数据丢失的终极解决方案

幻兽帕鲁存档迁移完全手册&#xff1a;告别数据丢失的终极解决方案 【免费下载链接】palworld-host-save-fix 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-host-save-fix 你是否曾在更换幻兽帕鲁服务器时&#xff0c;眼睁睁看着自己辛苦培养的角色数据消失无…...

SDXL 1.0工坊应用场景:短视频团队低成本制作分镜概念图

SDXL 1.0工坊应用场景&#xff1a;短视频团队低成本制作分镜概念图 1. 引言&#xff1a;短视频创作的痛点与新解法 对于短视频团队来说&#xff0c;创意是灵魂&#xff0c;但将创意快速、低成本地可视化&#xff0c;却常常是个难题。尤其是在前期策划阶段&#xff0c;制作分镜…...

告别重复劳动:用快马AI智能生成OpenCode风格的高效工具函数

最近在开发一个需要大量表单验证的项目时&#xff0c;我发现每次都要重复写类似的验证逻辑&#xff0c;既浪费时间又容易出错。于是我开始寻找更高效的解决方案&#xff0c;最终在InsCode(快马)平台上找到了理想的工具。 需求分析 表单验证是每个Web项目都绕不开的基础功能。常…...

AMD Ryzen SDT调试工具:突破性实战指南,让你的处理器性能飙升200%

AMD Ryzen SDT调试工具&#xff1a;突破性实战指南&#xff0c;让你的处理器性能飙升200% 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. …...

HunyuanVideo-Foley高算力适配:RTX4090D显存利用率优化至92%实测

HunyuanVideo-Foley高算力适配&#xff1a;RTX4090D显存利用率优化至92%实测 1. 镜像概述与核心优势 HunyuanVideo-Foley私有部署镜像专为视频与音效生成任务深度优化&#xff0c;基于RTX 4090D 24GB显存硬件平台打造。经过CUDA 12.4与驱动550.90.07的针对性调优&#xff0c;…...

深入解读XDMA驱动:从/dev节点看透RK3588与FPGA的PCIe数据流(H2C/C2H通道详解)

深入解读XDMA驱动&#xff1a;从/dev节点看透RK3588与FPGA的PCIe数据流&#xff08;H2C/C2H通道详解&#xff09; 当你在RK3588开发板上执行ls /dev/xdma0_*命令时&#xff0c;那些神秘的字符设备节点背后隐藏着一套精密的PCIe通信体系。作为连接ARM SoC与FPGA的高速数据通道&…...

程序员副业变现全攻略

CSDN程序员副业图谱技术文章大纲副业方向分类技术变现类&#xff1a;外包开发、技术咨询、代码审核内容创作类&#xff1a;技术博客、视频教程、电子书编写产品开发类&#xff1a;独立应用、开源项目、插件工具教育培训类&#xff1a;在线课程、一对一辅导、技术直播技术栈与工…...

机器标识重置技术实现的Cursor Pro功能解锁解决方案

机器标识重置技术实现的Cursor Pro功能解锁解决方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial request li…...