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

Spring Boot 第一天知识汇总

一、Spring Boot 是什么?

简单说,Spring Boot 是简化 Spring 应用开发的框架 —— 它整合了整个 Spring 技术栈,提供了 “一站式” J2EE 开发解决方案。

核心优点

  • 快速创建独立运行的 Spring 项目,无需繁琐配置;
  • 内置 Tomcat、Jetty 等 Servlet 容器,应用无需打 war 包,直接用 java -jar 运行;
  • 提供 “启动器(Starter)” 自动管理依赖,避免版本冲突;
  • 大量自动装配,开箱即用,还能灵活修改默认值;
  • 无需 XML 配置,纯注解开发;
  • 自带准生产环境监控(如健康检查、指标收集)。

二、Spring Boot 项目创建方式

1. 手动创建(Maven 项目改造)

适合想深入理解依赖关系的场景,步骤如下:

  1. 新建 Maven 项目(打包方式选 jar);
  2. 在 pom.xml 中添加父工程(统一版本管理):
    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version> <!-- 版本可按需选择 -->
    </parent>
    
  3. 导入所需场景的启动器(如 web 开发):
    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
    </dependencies>
    
  4. 编写主程序类(启动入口):
    @SpringBootApplication
    public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
    }
    
  5. 编写 Controller 等业务代码,运行 main 方法即可启动。

2. 快速创建(Spring Initializer)

适合快速开发,IDE(如 IDEA、Eclipse)都支持:

  1. 新建项目时选择 “Spring Initializr”;
  2. 填写项目信息(Group、Artifact 等);
  3. 勾选所需依赖(如 Web、MySQL、MyBatis 等);
  4. 生成项目后,主程序类、目录结构已自动创建,直接编写业务代码即可。

三、为什么说 “约定大于配置”?

这是 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 简化了单元测试流程,只需两步:

  1. 导入测试 Starter

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
    </dependency>
    
  2. 编写测试类
    用 @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区别 

一、依赖管理与配置

对比项传统 SpringSpring Boot
依赖引入手动添加 JUnit、Mockito、Spring Test 等依赖,需处理版本兼容问题。通过 spring-boot-starter-test 一键引入所有测试依赖,自动管理版本。
配置文件需要手动配置 applicationContext.xml 或 Java 配置类,指定组件扫描路径、数据源等。自动加载默认配置,仅需 application.properties 覆盖少数自定义配置。
测试环境搭建需使用 @ContextConfiguration 注解指定配置文件或配置类。使用 @SpringBootTest 自动加载完整 Spring 上下文,或通过切片测试(如 @WebMvcTest)加载部分组件。

二、测试注解与框架支持

对比项传统 SpringSpring Boot
核心测试注解@RunWith(SpringJUnit4ClassRunner.class) + @ContextConfiguration@SpringBootTest(替代前者) + 切片测试注解(如 @WebMvcTest@DataJpaTest
模拟 HTTP 请求使用 MockMvcBuilders.standaloneSetup() 手动配置 MockMvc。自动注入 MockMvc,通过 @AutoConfigureMockMvc 启用。
数据库测试需手动配置嵌入式数据库(如 H2)或使用内存数据库。自动配置嵌入式数据库,支持 @DataJpaTest 专用注解。
属性配置测试需使用 @TestPropertySource 手动指定测试配置文件。支持 @TestConfiguration 或直接在测试类中覆盖属性。

三、测试效率与简化程度

场景传统 SpringSpring 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.controllercom.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 在此基础上增加了条件判断约定配置

  1. 条件判断:通过 @Conditional 系列注解,根据类路径、配置属性、Bean 存在性等条件决定是否注册 Bean。
  2. 约定配置:框架预定义了一套默认配置(如数据源、Web 服务器),开发者只需引入依赖即可触发相应配置。

核心依赖三个注解:

  1. @SpringBootApplication
    主程序类的核心注解,是一个 “组合注解”,包含:

    • @SpringBootConfiguration:标记当前类为配置类(相当于 @Configuration);
    • @EnableAutoConfiguration:开启自动配置(核心);
    • @ComponentScan:指定组件扫描范围(默认主程序类所在包)。
  2. @EnableAutoConfiguration
    开启自动配置的 “开关”,通过 @Import(EnableAutoConfigurationImportSelector.class) 向容器中导入自动配置类(xxxAutoConfiguration)。

    原理:启动时会扫描所有 jar 包中 META-INF/spring.factories 文件,加载其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 对应的配置类(如 HttpEncodingAutoConfigurationDataSourceAutoConfiguration 等),这些类会自动配置所需组件。

  3. @ConfigurationProperties
    将配置文件中的属性(如 application.yml 中的 person.name)绑定到 Java 类的属性上,实现配置与代码的解耦。

九、Spring Boot 项目演变史

从传统 Java 开发到 Spring Boot,经历了多个阶段:

  1. Servlet 时代:纯手动编写 Servlet、配置 web.xml,开发效率极低;
  2. SSH/SSM 时代:SSH(Struts + Spring + Hibernate)、SSM(Spring + SpringMVC + MyBatis)简化了开发,但仍需大量 XML 配置;
  3. 单体应用:所有功能打包成一个 war 包,部署到 Tomcat,适合小型项目,但迭代和扩展困难;
  4. SOA(面向服务架构):将系统拆分为多个服务,通过服务总线通信,但服务耦合度仍较高;
  5. 微服务:2014 年 Martin Fowler 提出,将系统拆分为独立部署的小型服务(每个服务专注一个功能),通过 HTTP 通信。Spring Boot 因简化配置、内置容器等特点,成为微服务开发的首选框架。

十、架构对比:垂直架构、单体架构与微服务

架构类型特点优点缺点
垂直架构按业务垂直划分(如电商的订单系统、用户系统独立部署)简单直接,初期开发快服务重复开发,数据冗余
单体架构所有功能打包成一个应用(如一个 war 包包含所有模块)部署简单,调试方便代码臃肿,迭代慢,故障影响整体
微服务拆分为独立部署的小型服务(每个服务有自己的数据库和接口)独立迭代、扩展灵活,技术栈多样分布
http://www.xdnf.cn/news/15807.html

相关文章:

  • UE5多人MOBA+GAS 26、为角色添加每秒回血回蓝(番外:添加到UI上)
  • redis-plus-plus安装与使用
  • 【vue-7】Vue3 响应式数据声明:深入理解 reactive()
  • 敏捷开发的历史演进:从先驱实践到全域敏捷(1950s-2025)
  • ubuntu 24.04 xfce4 钉钉输入抢焦点问题
  • XSS的学习笔记
  • ChatIM项目语音识别安装与使用
  • 拓展面试题之-rabbitmq面试题
  • [Python] -项目实战8- 构建一个简单的 Todo List Web 应用(Flask)
  • pip关于缓存的用法
  • Python Web框架详解:Flask、Streamlit、FastAPI
  • Pinia 核心知识详解:Vue3 新一代状态管理指南
  • 算法-递推
  • 在通信仿真场景下,Python 和 MATLAB 的性能差异主要体现在运行效率、并行计算、库支持、开发效率等方面。以下是基于最新资料的对比总结
  • AS32X601 系列 MCU 硬件最小系统设计与调试方案探析
  • Web-SQL注入数据库类型用户权限架构分层符号干扰利用过程发现思路
  • 基于SHAP的特征重要性排序与分布式影响力可视化分析
  • 两个路由器通过不同的网段互联
  • 【PTA数据结构 | C语言版】邻接矩阵表示的图基本操作
  • TD3与SAC强化学习算法深度对比
  • 六边形滚动机器人cad【7张】三维图+设计书明说
  • Github 贪吃蛇 主页设置
  • day057-docker-compose案例与docker镜像仓库
  • Fortinet FortiWeb sql注入导致RCE漏洞复现(CVE-2025-25257)
  • XSS漏洞总结
  • 前端基础知识Vue系列 - 11(Vue组件之间的通信方式)
  • CVE-2022-41128
  • 2024年全国青少年信息素养大赛Scratch编程挑战赛 小低组初赛
  • 深入解析Hadoop中的EditLog与FsImage持久化设计及Checkpoint机制
  • [学习] 双边带调制 (DSB) 与单边带调制 (SSB) 深度对比