【前置内容】Spring 学习笔记全系列传送门:
【前置内容】SpingMVC 学习笔记全系列传送门:
1、SpringBoot 简介
1.1 SpringBoot 快速入门
1.1.1 开发步骤
-
创建新模块,选择Spring初始化,并配置模块相关基础信息
-
选择当前模块需要使用的技术集
-
开发控制器类
-
运行自动生成的Application类
1.1.1.1 创建新模块
-
选择 Spring Initializr
,用来创建 SpringBoot
工程
-
打包方式这里需要设置为 Jar
-
选中 Web
,然后勾选 Spring Web
-
Java 版本选 Java8
-
pom.xml 文件预览
需要注意:
- 父包 spring-boot-starter-parent 的版本手动更改为了 2.6.3,jdk版本1.8 与 spring boot 3.0.0 版本不匹配,会报错
- <java.version> 修改为了1.8
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>priv.dandelion</groupId>
<artifactId>springboot_01_quickstart</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.1.1.2 创建 Controller
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping("/{id}")
public String getById(@PathVariable Integer id) {
System.out.println("id = " + id);
return "hello boot!";
}
}
1.1.1.3 启动服务器
直接运行引导类即可
1.1.2 开发内容对比
-
坐标
Spring
程序中的坐标需要自己编写,而且坐标非常多
SpringBoot
程序中的坐标是我们在创建工程时进行勾选自动生成的
-
web3.0配置类
Spring
程序需要自己编写这个配置类。这个配置类大家之前编写过,肯定感觉很复杂
SpringBoot
程序不需要我们自己书写
-
配置类
注意:基于Idea的 Spring Initializr
快速构建 SpringBoot
工程时需要联网。
Spring/SpringMVC
程序的配置类需要自己书写。而 SpringBoot
程序则不需要书写。
1.1.3 官网构建工程
SpringBoot官网:https://spring.io/projects/spring-boot
1.1.4 SpringBoot 工程快速启动
1.1.4.1 问题引入
- SpringBoot 程序服务器运行在本机
- 当进行前后端联调时,按理说前端需要连接后端开发的机器,比较麻烦
- 是否有更好的方式?
1.1.4.2 打包
1.1.4.3 启动
1.2 SpringBoot 概述
1.2.1 起步依赖 —— 核心:Maven 继承
以后需要使用技术,只需要引入该技术对应的起步依赖即可
-
使用 Spring Initializr
方式创建的 Maven
工程的的 pom.xml
配置文件中自动生成了很多包含 starter
的依赖,这些以来就是启动依赖,如下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
</parent>
<!--
...
-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
1.2.1.1 探索父工程(源码不表)
1.2.1.2 探索依赖
-
本工程中添加了如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
-
可以看到 spring-boot-starter-web 引入了如下依赖
- 引入了
spring-web
和 spring-webmvc
的依赖,这就是为什么我们的工程中没有依赖这两个包还能正常使用 springMVC
中的注解的原因。
- 而依赖
spring-boot-starter-tomcat
,从名字基本能确认内部依赖了 tomcat
,所以我们的工程才能正常启动。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.7.8</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.7.8</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.7.8</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.25</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.25</version>
<scope>compile</scope>
</dependency>
</dependencies>
1.2.1.3 小结
-
starter
SpringBoot
中常见项目名称,定义了当前项目使用的所有项目坐标,以达到减少依赖配置的目的
-
parent
- 所有
SpringBoot
项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的
-
实际开发
1.2.2 程序启动
1.2.3 切换 web 服务器
-
目前启动工程使用的是 tomcat
服务器,spring-boot-starter-web
依赖中依赖了 tomcat
-
如果要使用其他服务器就需要将 tomcat 排除,更换为 jetty
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
2、配置文件
2.1 配置文件格式及优先级
- 当三种配置文件均存在时,优先级
application.properties
> application.yml
> application.yaml
SpringBoot
程序的配置文件名必须是 application
,只是后缀名不同
-
application.properties
server.port=80
-
application.yml
(常用)
server:
port: 81
-
application.yaml
server:
port: 82
2.2 yaml 格式
2.2.1 概述
-
特点
-
优点
-
容易阅读
yaml
类型的配置文件比 xml
类型的配置文件更容易阅读,结构更加清晰
-
容易与脚本语言交互
-
以数据为核心,重数据轻格式
-
扩展名
2.2.2 语法规则
2.3 yaml 配置文件数据读取
2.3.1 环境准备
2.3.2 读取配置数据
2.3.2.1 使用 @Value 注解
直接使用 @Value("${ }")
注解进行注入,用于读取单个数据,参数为${ }
包裹的数据名称的字符串
2.3.2.2 Environment 对象
用于获取全部数据,使用时对Environment
类型的属性进行自动装配,使用其getProperty()
方法来获取数据
2.3.2.3 自定义对象
该方式用于读取任意数据,将其封装为实体类,使用注解绑定获取数据的范围,在获取时,通过自动注入获取该实体类对象并进行操作
-
定义数据的实体类,和配置文件中保持一致,并实现其 Getter 和 Setter
- 后续要使用自动装配,故要添加 @Component 注解,将这个类交给 Spring 管理
- 使用
@ConfigurationProperties(prefix = "enterprise")
注解,prefix
属性值表示读取配置文件的哪一部分数据,此处代表读取 enterprise
中的数据
@Component
@ConfigurationProperties(prefix = "enterprise")
public class Enterprise {
private String name;
private int age;
private String tel;
private String[] subject;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String[] getSubject() {
return subject;
}
public void setSubject(String[] subject) {
this.subject = subject;
}
@Override
public String toString() {
return "Enterprise{" +
"name='" + name + '\'' +
", age=" + age +
", tel='" + tel + '\'' +
", subject=" + Arrays.toString(subject) +
'}';
}
}
-
Controller 示例
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private Enterprise enterprise;
@GetMapping("/{id}")
public String getById(@PathVariable Integer id) {
System.out.println(enterprise);
return "hello boot!";
}
}
2.4 多环境配置
2.4.1 yaml 文件
-
简单书写
- 使用
spring.profiles
设定环境的名称
- 使用
---
将不同的环境进行分隔
- 使用
spring.profiles.active
设置启动项目时使用的环境
- 公用的配置可以写在第一部分中
#设置启用的环境
spring:
profiles:
active: test
---
#开发环境
spring:
profiles: dev
server:
port: 80
---
#测试环境
spring:
profiles: test
server:
port: 81
---
#生产环境
spring:
profiles: pro
server:
port: 82
-
标注书写
简单书写部分中,设定环境的名称的spring.profiles
的书写格式并不规范,规范的书写格式如下
#开发环境
spring:
config:
activate:
on-profile: dev
server:
port: 80
2.4.2 properties 文件
- 与 yaml 文件不同,properties 的多环境配置写在不同的文件中,并在主配置文件中指定使用的环境
- 多个环境使用文件名进行区分和定义,
application-环境名.properties
- 公用的配置可以写
application.properties
中
2.4.3 命令行启动参数配置
2.5 配置文件分类
-
命令行启动参数配置存在问题
- 由于测试环境和开发环境的很多配置都不相同,所以测试人员在运行我们的工程时需要临时修改很多配置,可能参数过多,过于复杂
-
解决方案:额外的配置类
3、SpringBoot 整合 Junit
Spring 整合 Junit 回顾
3.1 环境准备
3.2 测试类编写
4、SpringBoot 整合 Mybatis
4.1 回顾 Spring 整合 Mybatis
4.2 SpringBoot 整合Mybatis
4.2.1 创建模块
-
依赖
- MyBatis Framework
- MySQL Driver
4.2.2 定义实体类
public class Book {
private Integer id;
private String name;
private String type;
private String description;
// Getter、Setter、toString...
}
4.2.3 定义 dao
数据库SQL见前置内容,tbl_book 表SQL,此处不再赘述
4.2.4 定义测试类
@SpringBootTest
class Springboot03MybatisApplicationTests {
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
Book book = bookDao.getById(1);
System.out.println(book);
}
}
4.2.5 编写配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db
username: root
password: 123456
4.2.6 使用 Druid 数据源
-
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
-
添加配置,指定使用 Druid 数据源
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
5、基于 SpringBoot 的 SSM 整合案例
- 本节内容是对上一篇 SSM 整合案例的改进,可参见SpingMVC 学习笔记 - 第二章 -SSM整合案例
- 开发步骤
-
pom.xml:配置起步依赖,必要的资源坐标(druid)
-
application.yml:设置数据源、端口等
-
配置类:现在不需要了
-
dao:设置@Mapper
-
测试类
-
页面:放置在resources目录下的static目录中
5.1 创建工程
-
依赖
- Spring Web
- MyBatis Framework
- MySQL Driver
-
引入Druid
5.2 后端代码整理
-
config 包,对比 SSM 项目全部删除,现在不需要了
-
entity 包,实体,无变化
-
dao,添加@Mapper
注解
// TODO 添加@Mapper
@Mapper
public interface BookDao {
@Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
// @Insert("insert into tbl_book (type,name,description) values(#{type},#{name},#{description})")
public int save(Book book);
@Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
public int update(Book book);
@Delete("delete from tbl_book where id = #{id}")
public int delete(Integer id);
@Select("select * from tbl_book where id = #{id}")
public Book getById(Integer id);
@Select("select * from tbl_book")
public List<Book> getAll();
}
-
service,无变化
-
exception,无变化
-
controller,无变化
-
测试类,使用了 @SpringBootTest 注解,更换了使用的包
// import org.junit.Test;
import org.junit.jupiter.api.Test;
// import ...
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = SpringConfig.class)
// TODO 将原先使用的注解更改为 @SpringBootTest
@SpringBootTest
public class BookServiceTest {
@Autowired
private BookService bookService;
// TODO 原先使用的 @Test 注解 现在需要重新导包
@Test
public void testGetById() {
Book byId = bookService.getById(1);
System.out.println(byId);
}
@Test
public void testGetAll() {
List<Book> all = bookService.getAll();
System.out.println(all);
}
}
5.3 配置文件
#TODO 配置端口和数据源相关信息
server:
port: 80
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db
username: root
password: 123456
5.4 静态资源
5.5 包结构展示

5.6 其他问题
- 若再未加入前端代码时启动过服务器,加入前端代码后无法正常访问到页面时
- 执行 Maven 的 clean 指令,再重新启动服务器(重新打包)即可
- SpringBoot 版本问题、MySQL时区问题、项目无法构建、配置文件打包乱码等问题,本节笔记中均有提及,可向上查阅