乐途乐途
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
  • 学习路径
  • 第1章 Spring Boot 概述

    • 章节导读:Spring Boot概述与核心理念
    • Spring Boot是什么
    • Spring Boot与Spring Framework的关系
    • 约定优于配置
  • 第2章 快速入门与第一个应用

    • 章节导读:快速入门与第一个应用
    • SpringApplication
    • 第一个Spring Boot应用
  • 第3章 起步依赖与版本管理

    • 章节导读:起步依赖与版本管理
    • 起步依赖
    • BOM版本管理
  • 第4章 自动配置原理

    • 章节导读:自动配置原理
    • 自动配置原理
    • AutoConfigurationImportSelector
    • 自动配置报告
  • 第5章 核心注解

    • 章节导读:核心注解
    • @SpringBootApplication
    • @EnableAutoConfiguration
    • @ConditionalOnClass
    • @ConditionalOnMissingBean
    • @ConditionalOnBean
    • @ConditionalOnProperty
  • 第6章 外部化配置与属性绑定

    • 章节导读:外部化配置与属性绑定
    • 外部化配置
    • @ConfigurationProperties
    • @Value
    • 配置属性优先级
  • 第7章 Profile 与环境切换

    • 章节导读:Profile与环境切换
    • @Profile
    • 多环境配置文件
  • 第8章 内嵌服务器与部署

    • 章节导读:内嵌服务器与部署
    • 内嵌服务器
    • Fat Jar
  • 第9章 Actuator 与监控

    • 章节导读:Actuator与监控
    • Actuator Health
    • Actuator Info
    • Actuator Metrics
    • 自定义Endpoint
    • 自定义HealthIndicator
  • 第10章 开发工具与最佳实践

    • 章节导读:开发工具与最佳实践
    • Banner自定义
    • 热部署

一句话定位:Spring Boot 是构建在 Spring Framework 5.x 之上的快速开发增强层,通过自动配置、起步依赖和内嵌容器三大能力,让 Java 企业级应用实现"开箱即用、一键运行"。


定义与作用

Spring Boot 是基于 Spring Framework 的快速应用开发框架,遵循"约定优于配置(Convention over Configuration)"理念,通过自动配置、起步依赖(Starter)和嵌入式服务器三大核心能力,将开发者从繁琐的 XML 配置和服务器部署中解放出来,实现"just run"的开发体验。

它解决的痛点:

痛点传统SSM开发Spring Boot 方案
配置繁琐手写 applicationContext.xml、spring-mvc.xml、mybatis-config.xml 等数十个配置文件自动配置,只需 application.yml 覆盖关键项
依赖冲突手动管理 Spring 5.x、MyBatis、Jackson、Servlet 等版本,易出现 ClassNotFoundExceptionStarter 统一管理兼容版本,引入一个Starter即获全套依赖
服务器部署打包 WAR 文件,部署到外部 Tomcat,调整 server.xml内嵌 Tomcat,直接 java -jar 运行
运维盲区需自行集成 Health Check、Metrics、日志收集内置 Actuator 提供生产级监控端点
启动缓慢大量 XML 解析、手动初始化数据源条件化自动配置,按需装配,启动更快

Spring Boot 并非 Spring Framework 的替代品,而是构建在 Spring Framework 之上的增强层(详见本章「Spring Boot 与 Spring Framework 的关系」)。


适用位置与常用属性

Spring Boot 本身不是一个注解或类,而是一个框架体系。它通过以下核心入口点融入项目:

入口点类型作用典型出现位置
SpringApplication.run()静态方法启动整个Spring Boot应用主启动类的 main() 方法
@SpringBootApplication组合注解启用自动配置、组件扫描、配置类主启动类声明
spring-boot-starter-parentMaven父POM统一版本管理、插件配置pom.xml 的 <parent> 节点
application.yml配置文件外部化配置,覆盖自动配置默认值src/main/resources

常用版本选择

版本对应Spring Framework最低Java版本状态
2.7.x5.3.xJava 8本教程采用(2.7.18),维护期至2025年
3.0.x6.0.xJava 17使用 jakarta 命名空间
3.2.x6.1.xJava 17当前主流推荐

本教程统一采用 Spring Boot 2.7.18(对应 Spring Framework 5.3.x),兼容 Java 8,使用 javax 命名空间,与飞翔科技现有基础设施兼容。


核心原理

Spring Boot 在Spring生态中的位置

层次解读:

  • JVM/服务器层:Spring Boot 将 Tomcat 直接嵌入应用,应用本身即服务器进程。
  • Spring Framework 核心层:IoC容器、AOP、数据访问、Web MVC等底层能力由 Spring Framework 提供(详见Spring Core教程)。
  • Spring Boot 增强层:自动配置决定"何时装配哪些Bean";Starter决定"引入哪些依赖";Actuator提供运维端点;外部化配置让同一份代码在不同环境表现不同。

三大核心能力的协作关系


完整示例

场景说明

广州飞翔科技的技术部正在开发一套学生成绩管理系统。架构师白歌需要向后端开发小崔解释:"为什么我们要用Spring Boot而不是传统Spring MVC?" 白歌决定用两个项目对比来说明。

操作前:传统SSM项目结构(对比项)

传统 Spring + Spring MVC + MyBatis 项目(简称 SSM)需要以下配置:

ssm-student/
├── src/main/resources/
│   ├── spring/
│   │   ├── applicationContext.xml      ← 数据源、事务、扫描包
│   │   ├── spring-mvc.xml              ← 视图解析器、静态资源、注解驱动
│   │   └── mybatis-config.xml          ← 别名、映射文件路径
│   ├── jdbc.properties                 ← 数据库连接参数
│   └── log4j.properties
└── webapp/WEB-INF/
    └── web.xml                          ← DispatcherServlet、ContextLoaderListener、字符编码过滤器

web.xml 片段:

<web-app>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

小崔数了数:仅配置相关的 XML 和 properties 文件就超过 200 行,而业务代码还没开始写。

使用Spring Boot的完整代码

同一个学生成绩管理系统,用Spring Boot 2.7.18实现:

pom.xml:

<?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 
                             http://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.7.18</version>
    </parent>

    <groupId>com.feixiang</groupId>
    <artifactId>student-management</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
</project>

application.yml(统一YAML格式):

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/student_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

server:
  port: 8080

主启动类:

package com.feixiang.student;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class StudentManagementApplication {
    public static void main(String[] args) {
        SpringApplication.run(StudentManagementApplication.class, args);
    }
}

业务组件(StudentService):

package com.feixiang.student.service;

import org.springframework.stereotype.Service;

@Service
public class StudentService {
    public String queryScore(String studentId) {
        return "学生 " + studentId + " 的成绩查询结果";
    }
}

操作后运行结果及分析

启动应用后,控制台输出:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v2.7.18)

2024-05-20 09:15:32.123  INFO 12345 --- [main] c.f.s.StudentManagementApplication : Starting StudentManagementApplication
2024-05-20 09:15:33.789  INFO 12345 --- [main] o.s.b.w.e.t.TomcatWebServer          : Tomcat started on port(s): 8080 (http)
2024-05-20 09:15:34.123  INFO 12345 --- [main] c.f.s.StudentManagementApplication : Started in 2.345 seconds

分析:

  1. 零 XML:整个项目没有 web.xml,没有 spring-mvc.xml,没有 applicationContext.xml。
  2. 自动装配数据源:因为类路径存在 spring-jdbc 和 HikariCP,Spring Boot 自动创建 DataSource Bean 并注入 application.yml 中的连接参数。
  3. 自动装配 Web 环境:因为类路径存在 spring-boot-starter-web,Tomcat 自动启动,端口 8080,DispatcherServlet 自动注册到 /。
  4. 组件自动扫描:@SpringBootApplication 隐式包含 @ComponentScan,StudentService 被自动发现并注册为 Bean。

小崔感叹:"传统 SSM 我写了 200 行配置,Spring Boot 我只写了 10 行 application.yml,效果完全一样!"


易错场景与面试考点

易错场景:把 Spring Boot 当成 Spring Framework 的替代品

小崔曾以为:"用了 Spring Boot 就不需要学 Spring Framework 了。" 结果在排查一个 Bean 循环依赖问题时完全无从下手。

错误认知:

// 小崔试图在 Spring Boot 中完全绕过 Spring Core 的概念
@Service
public class StudentService {
    @Autowired  // 虽然能工作,但小崔不知道这是 Spring Core 的 IoC/DI 机制
    private StudentRepository repository;
}

后果:Spring Boot 的自动配置、条件注解、外部化配置等所有能力都建立在 Spring Framework 的 IoC 容器之上。不懂 Spring Core 的 Bean 生命周期、作用域、依赖注入,就无法理解 Spring Boot 自动配置为什么有时不生效、为什么 @ConditionalOnMissingBean 能工作。遇到复杂问题时(如自定义 AutoConfiguration、调整 BeanPostProcessor 顺序),缺乏 Spring Framework 功底会让小崔寸步难行。

正确认知:Spring Boot 是用法的简化,不是原理的替代。Spring Framework 的 IoC、AOP、事务管理依然是底层基石(详见 Spring Core 教程)。

面试考点

Q:Spring Boot 的三大核心设计目标是什么?

① 快速搭建:通过 Spring Initializr 几分钟内生成可运行项目骨架;② 开箱即用:提供大量 Starter,自动引入兼容的依赖版本组合;③ 无服务器绑定:内嵌 Tomcat/Jetty/Undertow,无需部署 WAR 文件。此外还包括"无代码生成"和"生产就绪"(Actuator)。

Q:Spring Boot 2.7.x 与 3.x 的最大区别是什么?

版本基底不同:2.7.x 基于 Spring Framework 5.3.x,兼容 Java 8,使用 javax.servlet 命名空间;3.x 基于 Spring Framework 6.x,要求 Java 17+,使用 jakarta.servlet 命名空间(Jakarta EE 9+)。迁移 3.x 需要改包名和升级 JDK。

Q:Spring Boot 的自动配置和 Spring Framework 的 Java Config 是什么关系?

Spring Framework 的 @Configuration + @Bean 提供了"手动配置"的能力;Spring Boot 的自动配置是在此基础上,通过 spring.factories 和条件注解实现"根据 classpath 自动判断、自动注册",本质仍是 Spring Framework 的 @Configuration 类,只是由框架自动加载而非开发者手写。

上一页
章节导读:Spring Boot概述与核心理念
下一页
Spring Boot与Spring Framework的关系