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

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

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

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


文章目录

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


1、spring-boot 模块介绍

1.1、spring-boot 概述

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

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

Maven 坐标:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot</artifactId>
</dependency>
1.2、spring-boot 模块依赖

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

  <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(...) 是整个启动流程的起点,里面封装了大量自动化配置和容器初始化逻辑。

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

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

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

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

2.4、创建并刷新 ApplicationContext
context = createApplicationContext();
context.refresh();
  • 创建容器(如 AnnotationConfigServletWebServerApplicationContext
  • 扫描 @ComponentScan、注册配置类
  • 触发 @Bean@Configuration@Component 等注解的处理
  • 加载并实例化所有 Spring Bean
2.5、启动内嵌 Servlet 容器
  • 如果是 Web 应用,则会创建并启动内嵌 Tomcat/Jetty/Undertow
  • 注册 DispatcherServlet 等核心组件
2.6、回调执行器
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() 方法创建并启动容器

举例:

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 的持续发展,未来它将更加成熟,并融入更多创新的特性,继续推动现代应用开发的进步。

相关文章:

  • 三角形神经网络(TNN)
  • 技术与情感交织的一生 (七)
  • 【机器学习案列-21】基于 LightGBM 的智能手机用户行为分类
  • 笔记本电脑研发笔记:BIOS,Driver,Preloader详记
  • 【漏洞复现】Struts2系列
  • PDF处理控件Aspose.PDF指南:使用 Python 将 EPUB 转换为 PDF
  • [OpenGL] Lambertian材质漫反射BRDF方程的解释与推导
  • 新能源汽车可视化大屏系统毕业设计
  • C++设计模式
  • C语言高频面试题——malloc 和 calloc区别
  • 前端开发核心知识详解:Vue2、JavaScript 与 CSS
  • Centos7安装Jenkins(图文教程)
  • Linux进程6-alarm闹钟定时终止、raise发送信号、abort终止、pause挂起进程验证
  • 新能源汽车充电桩:多元化运营模式助力低碳出行
  • List findIntersection getUnion
  • 【Python进阶】数据可视化:Matplotlib从入门到实战
  • springboot项目配置springMVC
  • MATLAB Coder 应用:转换 MATLAB 代码至 C/C++ | 实践步骤与问题解决
  • mockMvc构建web单元测试学习笔记
  • C++学习:六个月从基础到就业——C++学习之旅:STL容器详解
  • 官宣一起打造智能汽车品牌后,华为喊话上汽要准备好足够产能
  • 安徽临泉一小区交付后多楼层现裂缝,专家组论证称不影响安全
  • 最大涨幅9800%!金价新高不断,引发期权“末日轮”效应,沪金期权多张合约大涨
  • 今年一季度,上海对东盟进出口总值同比增长7.1%
  • 学者建议:引入退休教师、青少年宫参与课后服务,为教师“减负”
  • 马拉松夺冠机器人将小批量量产:价格与一台入门级小轿车差不多