Spring Boot 第一天知识汇总
一、Spring Boot 是什么?
简单说,Spring Boot 是简化 Spring 应用开发的框架 —— 它整合了整个 Spring 技术栈,提供了 “一站式” J2EE 开发解决方案。
核心优点:
- 快速创建独立运行的 Spring 项目,无需繁琐配置;
- 内置 Tomcat、Jetty 等 Servlet 容器,应用无需打 war 包,直接用
java -jar
运行; - 提供 “启动器(Starter)” 自动管理依赖,避免版本冲突;
- 大量自动装配,开箱即用,还能灵活修改默认值;
- 无需 XML 配置,纯注解开发;
- 自带准生产环境监控(如健康检查、指标收集)。
二、Spring Boot 项目创建方式
1. 手动创建(Maven 项目改造)
适合想深入理解依赖关系的场景,步骤如下:
- 新建 Maven 项目(打包方式选 jar);
- 在
pom.xml
中添加父工程(统一版本管理):<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version> <!-- 版本可按需选择 --> </parent>
- 导入所需场景的启动器(如 web 开发):
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> </dependencies>
- 编写主程序类(启动入口):
@SpringBootApplication public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);} }
- 编写 Controller 等业务代码,运行 main 方法即可启动。
2. 快速创建(Spring Initializer)
适合快速开发,IDE(如 IDEA、Eclipse)都支持:
- 新建项目时选择 “Spring Initializr”;
- 填写项目信息(Group、Artifact 等);
- 勾选所需依赖(如 Web、MySQL、MyBatis 等);
- 生成项目后,主程序类、目录结构已自动创建,直接编写业务代码即可。
三、为什么说 “约定大于配置”?
这是 Spring Boot 最核心的思想,简单理解:提前约定好一套规范,开发者无需手动配置,按约定开发即可。
在传统开发中,很多工作需要通过配置文件(如 XML、JSON、注解等)明确指定细节(比如类的位置、方法的映射规则、资源的路径等)。但这些配置往往是 “重复性” 的 —— 大多数项目的需求是相似的,比如 “控制器类通常放在controller
目录”“数据库表名通常和实体类名对应”。
“约定大于配置” 的本质是:框架或工具预先定义这些 “常见规则” 作为 “约定”,开发者只需遵循约定,就能省略这些重复配置;只有当需求特殊(比如想把控制器放在api
目录而非controller
),才需要手动配置来 “覆盖约定”。
比如:
Spring Boot 的目录约定
早期的 Spring 框架需要大量 XML 配置来指定 “哪个类是控制器”“哪个方法映射哪个 URL”“服务类如何注入”。而 Spring Boot 采用 “约定大于配置” 后,通过目录结构约定简化了这些工作:
- 约定:
src/main/java/com/xxx/controller
目录下的类默认是控制器(无需额外注解声明 “这是控制器”); - 约定:
src/main/java/com/xxx/service
目录下的类默认是服务层(框架会自动扫描并管理依赖注入); - 约定:配置文件默认放在
src/main/resources/application.properties
(无需指定 “配置文件在哪”); - 约定:Web 应用默认端口是 8080(无需配置 “服务器端口”)。
好处:减少重复配置,提高开发效率,团队协作更规范(大家都按同一套约定开发)。
四、Starter 启动器:依赖管理的 “万能钥匙”
Starter(启动器) 是 “约定大于配置” 理念的典型实践,也是 Spring Boot 对 “场景化开发” 的解决方案:一个 Starter 对应一个开发场景,导入它就会自动包含该场景所需的所有依赖。
传统的 Spring 项目开发中,开发者需要手动做两件麻烦事:
- 依赖管理:为了实现某个功能(如 Web 开发),需要手动引入一系列相关依赖(如 Spring MVC、Tomcat、Jackson 等),且要保证依赖版本兼容,否则容易出现 “jar 包冲突”。
- 基础配置:引入依赖后,还需要手动配置基础组件(如 DispatcherServlet、数据源、事务管理器等),配置繁琐且重复。
Starter 的出现就是为了解决这两个问题:它通过 “预定义约定”,把某一场景所需的依赖、默认配置打包好,开发者只需引入一个 Starter,就能自动获得该场景的所有必要支持。
比如:
spring-boot-starter-web
:包含 web 开发所需的 Spring MVC、Tomcat、JSON 解析等依赖;spring-boot-starter-jdbc
:包含 JDBC 开发所需的数据源、事务管理等依赖;spring-boot-starter-test
:包含单元测试所需的 JUnit、Mockito 等依赖。
使用方式:只需在 pom.xml
中添加对应的 Starter 依赖,Spring Boot 会自动处理依赖传递和版本匹配,无需手动导入一堆 jar 包。
五、Spring Boot 整合单元测试
Spring Boot 简化了单元测试流程,只需两步:
导入测试 Starter:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency>
编写测试类:
用@SpringBootTest
标注测试类(自动加载 Spring 上下文),结合 JUnit 的@Test
即可:@SpringBootTest // 加载 Spring 容器 public class UserControllerTest {@Autowiredprivate UserController userController; // 注入要测试的组件@Testpublic void testHello() {String result = userController.hello();System.out.println(result); // 输出测试结果} }
Spring Boot 整合单元测试和spring区别
一、依赖管理与配置
对比项 | 传统 Spring | Spring Boot |
---|---|---|
依赖引入 | 手动添加 JUnit、Mockito、Spring Test 等依赖,需处理版本兼容问题。 | 通过 spring-boot-starter-test 一键引入所有测试依赖,自动管理版本。 |
配置文件 | 需要手动配置 applicationContext.xml 或 Java 配置类,指定组件扫描路径、数据源等。 | 自动加载默认配置,仅需 application.properties 覆盖少数自定义配置。 |
测试环境搭建 | 需使用 @ContextConfiguration 注解指定配置文件或配置类。 | 使用 @SpringBootTest 自动加载完整 Spring 上下文,或通过切片测试(如 @WebMvcTest )加载部分组件。 |
二、测试注解与框架支持
对比项 | 传统 Spring | Spring Boot |
---|---|---|
核心测试注解 | @RunWith(SpringJUnit4ClassRunner.class) + @ContextConfiguration | @SpringBootTest (替代前者) + 切片测试注解(如 @WebMvcTest 、@DataJpaTest ) |
模拟 HTTP 请求 | 使用 MockMvcBuilders.standaloneSetup() 手动配置 MockMvc。 | 自动注入 MockMvc ,通过 @AutoConfigureMockMvc 启用。 |
数据库测试 | 需手动配置嵌入式数据库(如 H2)或使用内存数据库。 | 自动配置嵌入式数据库,支持 @DataJpaTest 专用注解。 |
属性配置测试 | 需使用 @TestPropertySource 手动指定测试配置文件。 | 支持 @TestConfiguration 或直接在测试类中覆盖属性。 |
三、测试效率与简化程度
场景 | 传统 Spring | Spring Boot |
---|---|---|
单元测试(Service) | java<br>@RunWith(SpringJUnit4ClassRunner.class)<br>@ContextConfiguration(classes = AppConfig.class)<br>public class UserServiceTest {<br> @Autowired<br> private UserService userService;<br> // 测试代码<br>} | java<br>@SpringBootTest<br>public class UserServiceTest {<br> @Autowired<br> private UserService userService;<br> // 测试代码<br>} |
Controller 测试 | 需手动配置 Controller、Service Mock 和视图解析器。 | java<br>@WebMvcTest(UserController.class)<br>public class UserControllerTest {<br> @Autowired<br> private MockMvc mockMvc;<br> @MockBean<br> private UserService userService;<br> // 测试代码<br>} |
数据库集成测试 | 需配置数据源、事务管理器,手动回滚数据。 | java<br>@DataJpaTest<br>public class UserRepositoryTest {<br> @Autowired<br> private UserRepository userRepository;<br> // 测试代码(自动回滚)<br>} |
六、Spring Boot 如何扫描组件?
Spring Boot 会自动扫描并加载容器中的组件(@Controller、@Service、@Component 等),扫描范围由 主程序类(@SpringBootApplication 标注)所在包及所有子包 决定。
比如:
- 主程序类在
com.example.demo
包下; - 则
com.example.demo.controller
、com.example.demo.service
等子包中的组件会被自动扫描; - 若组件放在
com.example.other
包(主程序类所在包的外部),则需要手动添加@ComponentScan("com.example.other")
配置。
七、YAML 配置文件:比 properties 更优雅
Spring Boot 支持 application.yml
作为配置文件,语法比 application.properties
更简洁,适合复杂配置。
基本语法:
- 用
k: v
表示键值对(冒号后必须有空格); - 用缩进表示层级关系(不允许用 tab,建议 2 个空格);
- 大小写敏感。
示例:
# 配置服务器端口
server:port: 8081servlet:context-path: /demo # 项目访问路径# 配置自定义对象
person:name: 张三age: 20boss: falsebirth: 2003-01-01maps: {k1: v1, k2: v2} # Map 写法lists: [篮球, 足球] # List 写法dog: # 对象嵌套name: 旺财age: 3
如何读取配置?
用 @ConfigurationProperties
绑定配置到 Java 类:
@Component
@ConfigurationProperties(prefix = "person") // 绑定配置文件中 prefix 为 person 的属性
public class Person {private String name;private Integer age;// 省略 get/set 方法
}
八、自动装配原理:Spring Boot 如何 “自动” 工作?
自动装配是 Spring Boot “开箱即用” 的核心,简单说:Spring Boot 会根据导入的 Starter 和配置,自动创建并配置所需的组件(比如导入 web starter 会自动配置 DispatcherServlet)。
自动装配的本质是Spring 框架在启动时动态扫描并注册 Bean,但 Spring Boot 在此基础上增加了条件判断和约定配置:
- 条件判断:通过
@Conditional
系列注解,根据类路径、配置属性、Bean 存在性等条件决定是否注册 Bean。 - 约定配置:框架预定义了一套默认配置(如数据源、Web 服务器),开发者只需引入依赖即可触发相应配置。
核心依赖三个注解:
@SpringBootApplication:
主程序类的核心注解,是一个 “组合注解”,包含:@SpringBootConfiguration
:标记当前类为配置类(相当于@Configuration
);@EnableAutoConfiguration
:开启自动配置(核心);@ComponentScan
:指定组件扫描范围(默认主程序类所在包)。
@EnableAutoConfiguration:
开启自动配置的 “开关”,通过@Import(EnableAutoConfigurationImportSelector.class)
向容器中导入自动配置类(xxxAutoConfiguration)。原理:启动时会扫描所有 jar 包中
META-INF/spring.factories
文件,加载其中org.springframework.boot.autoconfigure.EnableAutoConfiguration
对应的配置类(如HttpEncodingAutoConfiguration
、DataSourceAutoConfiguration
等),这些类会自动配置所需组件。@ConfigurationProperties:
将配置文件中的属性(如application.yml
中的person.name
)绑定到 Java 类的属性上,实现配置与代码的解耦。
九、Spring Boot 项目演变史
从传统 Java 开发到 Spring Boot,经历了多个阶段:
- Servlet 时代:纯手动编写 Servlet、配置 web.xml,开发效率极低;
- SSH/SSM 时代:SSH(Struts + Spring + Hibernate)、SSM(Spring + SpringMVC + MyBatis)简化了开发,但仍需大量 XML 配置;
- 单体应用:所有功能打包成一个 war 包,部署到 Tomcat,适合小型项目,但迭代和扩展困难;
- SOA(面向服务架构):将系统拆分为多个服务,通过服务总线通信,但服务耦合度仍较高;
- 微服务:2014 年 Martin Fowler 提出,将系统拆分为独立部署的小型服务(每个服务专注一个功能),通过 HTTP 通信。Spring Boot 因简化配置、内置容器等特点,成为微服务开发的首选框架。
十、架构对比:垂直架构、单体架构与微服务
架构类型 | 特点 | 优点 | 缺点 |
---|---|---|---|
垂直架构 | 按业务垂直划分(如电商的订单系统、用户系统独立部署) | 简单直接,初期开发快 | 服务重复开发,数据冗余 |
单体架构 | 所有功能打包成一个应用(如一个 war 包包含所有模块) | 部署简单,调试方便 | 代码臃肿,迭代慢,故障影响整体 |
微服务 | 拆分为独立部署的小型服务(每个服务有自己的数据库和接口) | 独立迭代、扩展灵活,技术栈多样 | 分布 |