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

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.lryc.cn/news/594482.html

相关文章:

  • 【51单片机仿真复位电阻电容参数】2022-5-17
  • IsaacLab学习记录(四)
  • Linux文件系统三要素:块划分、分区管理与inode结构解析
  • [CVPR]DVFL-Net:用于时空动作识别的轻量级蒸馏视频调焦网络
  • Python知识点2-if语句
  • FreeRTOS学习笔记之内存管理
  • Raz解决问题:You are offline.
  • [Linux]进程 / PID
  • 【开源项目】基于RuoYi-Vue-Plus的开源进销存管理系统
  • Spring Boot 配置文件解析
  • USB技术发展史:从1.0到USB4的演进之路
  • Matplotlib Contourf 标注字体详细设置
  • Spring之AOP面向切面编程详解
  • 【数据结构】双向循环链表的实现
  • MyBatis从浅入深
  • day24——Java高级技术深度解析:单元测试、反射、注解与动态代理
  • 高性能熔断限流实现:Spring Cloud Gateway 在电商系统的实战优化
  • `SearchTransportService` 是 **协调节点与数据节点之间“搜索子请求”通信的运输层**
  • 4种快速创建SpringBoot项目的方法
  • Claude Code 逆向工程分析,探索最新Agent设计
  • JavaScript 中Object、Array 和 String的常用方法
  • 金融工程、金融与经济学知识点
  • 数据结构与算法汇总
  • 连接语言大模型(LLM)服务进行对话
  • GaussDB select into和insert into的用法
  • 机器学习基础:从数据到智能的入门指南
  • python生成密钥
  • Self-Consistency:跨学科一致性的理论与AI推理的可靠性基石
  • An End-to-End Attention-Based Approach for Learning on Graphs NC 2025
  • JAVA面试宝典 -《API设计:RESTful 与 GraphQL 对比实践》