Spring Boot 主模块 spring-boot 核心技术解析:从启动类到内嵌容器的无缝支持

在现代企业级应用的开发中,构建高效、简洁的应用框架是至关重要的。Spring Boot 作为 Spring 生态系统的重要一员,凭借其"约定优于配置"的理念,极大简化了传统 Spring 应用的开发过程。通过内嵌的容器支持、自动配置功能以及灵活的外部化配置,Spring Boot 不仅降低了开发门槛,还大大提高了开发效率。

本篇文章将详细解析 Spring Boot 的核心模块------spring-boot 模块。通过对该模块的分析,我们将深入理解 Spring Boot 的工作原理,如何自动化配置以及如何通过它提供的便捷机制加速应用开发。


文章目录

      • [1、spring-boot 模块介绍](#1、spring-boot 模块介绍)
        • [1.1、spring-boot 概述](#1.1、spring-boot 概述)
        • [1.2、spring-boot 模块依赖](#1.2、spring-boot 模块依赖)
        • [1.3、spring-boot 模块作用](#1.3、spring-boot 模块作用)
      • [2、Spring Boot 应用的启动核心:SpringApplication 类](#2、Spring Boot 应用的启动核心:SpringApplication 类)
        • [2.1、创建 SpringApplication 实例](#2.1、创建 SpringApplication 实例)
        • 2.2、准备环境
        • [2.3、打印 Banner](#2.3、打印 Banner)
        • [2.4、创建并刷新 ApplicationContext](#2.4、创建并刷新 ApplicationContext)
        • [2.5、启动内嵌 Servlet 容器](#2.5、启动内嵌 Servlet 容器)
        • 2.6、回调执行器
        • 2.7、发布应用启动事件
      • [3、对内嵌 Web 容器的支持](#3、对内嵌 Web 容器的支持)
      • [4、 提供了一流的配置外部化支持(Externalized Configuration)](#4、 提供了一流的配置外部化支持(Externalized Configuration))
      • 5、提供了方便的容器上下文初始化器、默认日志支持
      • X、后记

1、spring-boot 模块介绍

1.1、spring-boot 概述

Spring Boot 是基于 Spring 框架的快速开发框架,它通过"约定优于配置"的理念,极大地简化了 Spring 应用的开发和部署。Spring Boot 的主模块是核心模块之一,主要负责自动配置、应用启动、依赖管理等功能。

Spring Boot 的主模块是 spring-boot,它提供了框架的核心功能。这个模块并不直接用于开发应用,而是为其他模块和应用提供支撑和工具。

Maven 坐标:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
</dependency>
1.2、spring-boot 模块依赖

spring-boot 模块本身在构建时依赖了两个 Spring Framework 的核心模块:spring-corespring-context

xml 复制代码
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
    </dependency>
  </dependencies>

Spring Boot 本身不是一个完全替代 Spring 的框架,而是基于 Spring 之上提供增强功能。

  • spring-core:Spring Framework 的基础模块,提供了大量核心工具类和功能,几乎所有 Spring 项目都依赖它。
  • spring-context:这是 Spring 的应用上下文模块,建立在 spring-core 上,提供 IoC 容器的完整实现。
1.3、spring-boot 模块作用

spring-boot 作为 Spring Boot 框架的主模块,也是支持其他模块的核心模块,主要功能如下:

  • 提供了一个启动 Spring 应用的主类 SpringApplication
  • 提供了内嵌容器(如 Tomcat、Jetty、Undertow 等)的支持机制;
  • 提供了一流的配置外部化支持;
  • 供了一个很方便的 Spring 容器上下文初始化器,包括对合理记录日志默认参数的支持。

2、Spring Boot 应用的启动核心:SpringApplication 类

SpringApplication 类,是 Spring Boot 应用的启动核心。SpringApplication.run(...) 是整个启动流程的起点,里面封装了大量自动化配置和容器初始化逻辑。

java 复制代码
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

SpringApplication.run(...) 背后做了很多事情,我们来拆解一下它都干了什么。

2.1、创建 SpringApplication 实例
java 复制代码
SpringApplication app = new SpringApplication(MyApplication.class);
  • 判断项目类型(Servlet/WebFlux/非 Web)
  • 设置默认的 ApplicationContext 类型
  • 注册一堆 ApplicationContextInitializer
  • 注册一堆 ApplicationListener
  • 加载 spring.factories 中定义的自动配置类等
2.2、准备环境
java 复制代码
ConfigurableEnvironment env = prepareEnvironment(listeners, args);
  • 加载系统环境变量、命令行参数
  • 加载配置文件(application.properties / .yml 等)
  • 应用 profile(如 dev、prod 等)

默认会显示启动横幅(可以关掉),就是那串大字母 Spring Boot

2.4、创建并刷新 ApplicationContext
java 复制代码
context = createApplicationContext();
context.refresh();
  • 创建容器(如 AnnotationConfigServletWebServerApplicationContext
  • 扫描 @ComponentScan、注册配置类
  • 触发 @Bean@Configuration@Component 等注解的处理
  • 加载并实例化所有 Spring Bean
2.5、启动内嵌 Servlet 容器
  • 如果是 Web 应用,则会创建并启动内嵌 Tomcat/Jetty/Undertow
  • 注册 DispatcherServlet 等核心组件
2.6、回调执行器
java 复制代码
ApplicationRunner / CommandLineRunner
  • 启动完成后,自动调用实现了这些接口的 Bean
  • 常用于启动后执行初始化逻辑
2.7、发布应用启动事件

包括:

  • ApplicationStartedEvent
  • ApplicationReadyEvent
  • ContextRefreshedEvent

监听器可以响应这些事件,进行进一步操作(比如日志记录、健康检查等)

总的来说 SpringApplication.run() 就像一键启动器:它负责构建、配置、装配并运行你的整个 Spring Boot 应用,无需手动干预!


3、对内嵌 Web 容器的支持

虽然 Spring Boot 内嵌 Tomcat/Jetty/Undertow 本身的实现代码是在 spring-boot-starter-tomcat 等模块中,但核心的内嵌容器支持机制(例如抽象接口、启动流程等)是由 spring-boot 模块定义的。

它支持的方式:

  • 定义了统一的接口:WebServer(表示容器),ServletWebServerFactory(容器工厂)
  • 启动流程在 SpringApplication -> WebServerApplicationContext 中完成
  • 自动调用容器工厂的 .getWebServer() 方法创建并启动容器

举例:

java 复制代码
TomcatServletWebServerFactory -> 返回 TomcatWebServer 实例
TomcatWebServer.start() -> 启动 Tomcat 实例

可以自由切换容器,因为它们都实现了同一个接口结构,Spring Boot 做到了统一抽象。


4、 提供了一流的配置外部化支持(Externalized Configuration)

Spring Boot 允许你用多种方式配置应用行为,而不是写死在代码中。

支持哪些方式:

  • application.properties / application.yml
  • 命令行参数(--server.port=8081
  • 环境变量(SERVER_PORT=8081
  • @Value("${xxx}") 注入配置
  • @ConfigurationProperties 批量绑定

底层由 ConfigFileApplicationListener + EnvironmentPostProcessor 实现。而这些类都是在 spring-boot 模块中实现的,自动处理配置文件、加载顺序、优先级等。


5、提供了方便的容器上下文初始化器、默认日志支持

Spring Boot 提供了很多默认的启动行为,让我们零配置也能跑起来。

包括:

  • 默认初始化器:ApplicationContextInitializer, Spring 上下文初始化的接口,用于在 Spring 容器被刷新之前进行一些额外的初始化配置。
  • 默认监听器:如日志系统初始化(LoggingApplicationListener),是 Spring Boot 自动配置的日志初始化监听器,它会自动处理应用启动时的日志系统配置。
  • Spring Boot 默认集成了 SLF4J 和 Logback 作为日志系统。这意味着,无论你写什么日志(比如用 Logger 记录的 debuginfowarnerror),它都会通过 SLF4J 传递给 Logback 来输出到控制台或日志文件。

你几乎不需要写 logback.xml 就能有一个默认、结构化的控制台日志输出。这也是在 spring-boot 模块中实现的。


X、后记

Spring Boot 的设计目标是让开发者能专注于业务逻辑的实现,而不必为框架的配置、部署和启动过程浪费时间。通过对 spring-boot 模块的深入剖析,我们可以看到它如何通过智能的自动配置、容器支持以及简化的开发体验,彻底改变了传统的开发方式。无论是企业应用还是微服务架构,Spring Boot 都能为开发团队提供一个强大且灵活的基础框架。

随着 Spring Boot 的持续发展,未来它将更加成熟,并融入更多创新的特性,继续推动现代应用开发的进步。

相关推荐
only-qi1 小时前
146. LRU 缓存
java·算法·缓存
阿里小阿希1 小时前
Vue3 + Element Plus 项目中日期时间处理的最佳实践与数据库设计规范
数据库·设计规范
xuxie132 小时前
SpringBoot文件下载(多文件以zip形式,单文件格式不变)
java·spring boot·后端
白鹭2 小时前
MySQL源码部署(rhel7)
数据库·mysql
重生成为编程大王3 小时前
Java中的多态有什么用?
java·后端
666和7773 小时前
Struts2 工作总结
java·数据库
还听珊瑚海吗3 小时前
SpringMVC(一)
数据库
中草药z3 小时前
【Stream API】高效简化集合处理
java·前端·javascript·stream·parallelstream·并行流
野犬寒鸦3 小时前
力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
java·数据结构·算法·leetcode·面试
zru_96023 小时前
centos 系统如何安装open jdk 8
java·linux·centos