Spring Boot 第一天知识汇总

发布于:2025-07-21 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、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 {
      
      @Autowired
      private UserController userController; // 注入要测试的组件
      
      @Test
      public 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.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: 8081
  servlet:
    context-path: /demo # 项目访问路径

# 配置自定义对象
person:
  name: 张三
  age: 20
  boss: false
  birth: 2003-01-01
  maps: {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 包包含所有模块) 部署简单,调试方便 代码臃肿,迭代慢,故障影响整体
微服务 拆分为独立部署的小型服务(每个服务有自己的数据库和接口) 独立迭代、扩展灵活,技术栈多样 分布

网站公告

今日签到

点亮在社区的每一天
去签到