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

简单叙述 Spring Boot 启动过程

Spring Boot 是一个帮助 Java 开发者快速搭建和启动应用的框架。了解它的启动过程,可以帮助我们深入理解 Spring Boot 的工作原理,尤其是它如何将配置、组件扫描、自动配置等内容串联起来。我们用一个直观的流程来解读 Spring Boot 的启动过程。

1. 准备阶段:应用启动的入口

Spring Boot 应用程序的启动通常从一个 main 方法开始(在 Application 类中)。这个 main 方法会调用 SpringApplication.run(Application.class, args),其实就是从这一步开始启动整个应用。

流程描述

  • 你可以把 SpringApplication.run() 理解为一个“开关”,它会启动一连串的动作。
  • 一旦调用 run(),Spring Boot 就会进入自动化启动的“准备阶段”。

2. 创建 SpringApplication 对象:开始启动工作

SpringApplication.run() 会首先创建一个 SpringApplication 对象。这个对象可以看作是启动应用的“总指挥”,主要负责:

  • 设置应用的环境(Environment),比如是否是开发环境、生产环境等。
  • 加载初步配置。
  • 为后续的步骤做准备工作,比如准备监听器、事件发布等。

小贴士:在这个阶段,Spring Boot 会检查一些常见的配置文件(如 application.propertiesapplication.yml),并准备将这些配置信息应用到启动流程中。

3. 配置环境(Environment):识别开发环境与生产环境

Spring Boot 的 SpringApplication 对象会进一步去配置环境。比如,通过读取配置文件或者系统属性,它能识别应用当前是在开发环境还是生产环境,并根据不同环境做适当的优化。

案例

  • 假设你在 application.yml 中配置了 spring.profiles.active=dev,Spring Boot 会加载适用于 dev 环境的配置。
  • 这种分环境的配置机制,让应用在开发和生产之间可以无缝切换。

4. 启动监听器和初始化器:感知启动的关键事件

Spring Boot 启动过程中,还会初始化一些监听器(Listeners)和初始化器(Initializers)。它们的作用是“监听”启动过程中的各个步骤,并在关键时刻触发特定的逻辑。

案例

  • 你可以注册一个监听器,在 Spring Boot 启动时触发一些定制的行为,比如打印系统信息、记录日志等。

效果

  • 这种机制帮助开发者对启动过程拥有更高的可控性,也可以在启动时执行一些初始化工作。

5. 创建 ApplicationContext 容器:加载核心 Bean

这个步骤中,Spring Boot 会启动 ApplicationContext(应用上下文),它可以理解为一个容器,负责管理应用中的所有 Bean。

加载过程

  • ApplicationContext 会扫描项目中被 @Component@Service@Repository 等注解标记的类,把它们注册为 Bean。
  • Spring Boot 还会根据自动配置(Auto-Configuration),加载额外的 Bean。比如,发现项目里有数据库依赖时,自动配置会加载数据库连接池的相关 Bean。

案例

  • 当你用 @SpringBootApplication 注解启动项目时,自动配置会根据类路径下的依赖,比如 spring-boot-starter-web,帮你自动加载 Web 服务器的相关配置和 Bean。

6. 自动配置(Auto-Configuration):自动加载所需 Bean

自动配置是 Spring Boot 启动的核心亮点。Spring Boot 会检测项目中的依赖项,并根据依赖,自动加载对应的配置。比如:

  • 如果有 Web 相关的依赖(如 spring-boot-starter-web),Spring Boot 会自动配置一个内嵌的 Tomcat 服务器。
  • 如果项目中有数据库相关的依赖(如 spring-boot-starter-data-jpa),它会自动加载数据源、事务管理等 Bean。

案例

  • 假设项目中添加了一个 Redis 依赖(如 spring-boot-starter-data-redis),Spring Boot 会自动配置 Redis 连接池、RedisTemplate 等 Bean,免去了手动配置的麻烦。

7. 启动内嵌 Web 服务器:Tomcat、Jetty、Undertow

如果你的项目是一个 Web 项目(包含 Web 依赖),Spring Boot 会启动一个内嵌的 Web 服务器,比如 Tomcat。这个步骤会绑定端口(默认是 8080),并启动一个 Web 服务,准备接收 HTTP 请求。

效果

  • Spring Boot 的内嵌服务器特性,让我们无需安装和配置外部服务器,这也是 Spring Boot 应用可以直接运行的原因之一。

8. 执行 CommandLineRunner 和 ApplicationRunner

在 Spring Boot 的启动流程最后,如果项目里实现了 CommandLineRunnerApplicationRunner 接口的 Bean,那么这些 Bean 的 run() 方法会被调用,执行启动后的收尾工作。

案例

  • 例如,你可以实现一个 CommandLineRunner,在项目启动完成后执行一些初始化操作,比如从数据库加载默认数据,或检查系统状态等。

9. 启动完成:应用已准备好接收请求

到这里,Spring Boot 的启动流程基本完成。你的应用已经启动,所有配置已加载、Bean 已注册,服务也在监听端口等待请求。整个启动过程就是一个自动化和配置化的过程,让你专注业务代码,而不需要为每个 Bean、每个组件的配置费心。


总结

Spring Boot 的启动过程可以理解为九个关键步骤:

  1. 启动入口:调用 SpringApplication.run(),启动流程。
  2. 创建 SpringApplication 对象:做启动前的准备。
  3. 配置环境:识别开发环境与生产环境。
  4. 启动监听器和初始化器:处理关键事件。
  5. 创建 ApplicationContext 容器:加载 Bean。
  6. 自动配置:根据依赖自动加载相关配置。
  7. 启动 Web 服务器:若是 Web 项目,启动内嵌服务器。
  8. 执行 CommandLineRunner / ApplicationRunner:启动后执行收尾工作。
  9. 启动完成:应用准备好,开始接收请求。

Spring Boot 的启动过程充分展示了其“约定优于配置”的理念,极大简化了 Java 项目的启动流程。希望这篇文章能帮助你对 Spring Boot 的启动过程有更清晰的认识!

推荐阅读文章

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 什么是 Cookie?简单介绍与使用方法

  • 什么是 Session?如何应用?

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • 如何理解应用 Java 多线程与并发编程?

  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 如何理解线程安全这个概念?

  • 理解 Java 桥接方法

  • Spring 整合嵌入式 Tomcat 容器

  • Tomcat 如何加载 SpringMVC 组件

  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”

  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”

  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)

  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”

  • Java 中消除 If-else 技巧总结

  • 线程池的核心参数配置(仅供参考)

  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)

  • Java 枚举的几个常用技巧,你可以试着用用

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • 探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)

  • 为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)

相关文章:

简单叙述 Spring Boot 启动过程

文章目录 1. 准备阶段:应用启动的入口2. 创建 SpringApplication 对象:开始启动工作3. 配置环境(Environment):识别开发环境与生产环境4. 启动监听器和初始化器:感知启动的关键事件5. 创建 ApplicationCont…...

微信小程序自定义tabbar;禁用某个tab;修改某个tab的样式

微信小程序自定义tabbar;禁用某个tab;修改某个tab的样式 原本使用本身的tabBar就已经很舒服了,很合适了的,但是总有一些脑洞大开的产品和客户,给你搞点多样式,没办法牛马就得去做咯,现在就给大…...

力扣113:路径总和II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…...

JavaScript字符串常用方法

在JavaScript中,字符串是用来表示文本数据的基本数据类型。字符串可以用单引号()、双引号(")、或反引号()包裹。JavaScript中的字符串是不可变的,也就是说,字符串的值一旦创建就无法更改,但可以创建新字符串来替换原有字符串…...

xtu oj 加一

样例输入# 2 4 1 2 3 4 4 3 2 4 1样例输出# 3 5 解题思路:最小操作次数一定是把所有数变成数组中最大值max。 1、找最大值,一开始我把max初始值设为0,如果a[i]>max,maxa[i],WA了。又看了一遍题目,发现所有整数的绝对值小于…...

QTcpSocket 服务端和客户端

前提&#xff1a; pro文件中添加 QT network 服务端主要采用信号槽机制&#xff0c;代码如如下 核心代码头文件#ifndef TCPSERVER_H #define TCPSERVER_H#include <QObject>#include <QTcpServer> #include <QTcpSocket> #include <QDebug> #inclu…...

Isaac Sim+SKRL机器人并行强化学习

目录 Isaac Sim介绍 OmniIssacGymEnvs安装 SKRL安装与测试 基于UR5的机械臂Reach强化学习测评 机器人控制 OMNI GYM环境编写 SKRL运行文件 训练结果与速度对比 结果分析 运行体验与建议 Isaac Sim介绍 Isaac Sim是英伟达出的一款机器人仿真平台&#xff0c;适用于做机…...

项目中用户数据获取遇到bug

项目跟练的时候 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘code’) at Proxy.userInfo (user.ts:57:17) 因此我想要用result接受信息的时候会出错&#xff0c;报错显示为result.code没有该值 导致我无法获取到相应的数据 解决如下 给…...

SpringSecurity+jwt+captcha登录认证授权总结

SpringSecurityjwtcaptcha登录认证授权总结 版本信息&#xff1a; springboot 3.2.0、springSecurity 6.2.0、mybatis-plus 3.5.5 认证授权思路和流程&#xff1a; 未携带token&#xff0c;访问登录接口&#xff1a; 1、用户登录携带账号密码 2、请求到达自定义Filter&am…...

项目技术栈-解决方案-web3去中心化

web3去中心化 Web3 DApp区块链:钱包:智能合约:UI:ETH系开发技能树DeFi应用 去中心化金融P2P 去中心化网络参考Web3 DApp 区块链: 以以太坊(Ethereum)为主流,也包括Solana、Aptos等其他非EVM链。 区块链本身是软件,需要运行在一系列节点上,这些节点组成P2P网络或者半…...

【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:创新与应用

一、引言 随着科技的迅猛发展&#xff0c;声音克隆技术已经成为一个炙手可热的研究领域。SoVITS&#xff08;Sound Voice Intelligent Transfer System&#xff09;&#xff0c;作为该领域的先锋&#xff0c;凭借其卓越的性能和广泛的适用性&#xff0c;正在为多个行业带来前所…...

分清数据链路层、网络层、传输层的区别,以及这些层面的代表协议

目录 数据链路层 网络层 传输层 数据链路层 OSI模型的第二层&#xff0c;负责在相邻节点之间传输帧&#xff0c;处理帧的封装、地址、差错控制和流量控制等。确保数据在物理介质上可靠地传输&#xff0c;并为上层协议提供服务。 以太网&#xff08;Ethernet&#xff09;&…...

git没有识别出大写字母改成小写重命名的文件目录

Git 默认不会跟踪大写字母和小写字母的区别&#xff0c;因为在大多数文件系统中&#xff0c;大写字母和小写字母被认为是相同的文件&#xff0c;只有在区分大小写的文件系统中&#xff08;如 macOS 的 HFS 或 Windows 的 NTFS&#xff09;&#xff0c;这才是一个问题。 如果重命…...

自己动手写Qt Creator插件

文章目录 前言一、环境准备1.先看自己的Qt Creator IDE的版本2.下载源码 二、使用步骤1.参考原本的插件2.编写自定义插件1.cmakelist增加一个模块2.同理&#xff0c;qbs文件也增加一个3.插件源码 三、效果总结 前言 就目前而言&#xff0c;Qt Creator这个IDE&#xff0c;插件比…...

数据重塑:长宽数据转换【基于tidyr】

在数据分析和可视化过程中&#xff0c;数据的组织形式直接影响着我们能够进行的分析类型和可视化效果。这里简单介绍两种常见的数据格式&#xff1a;长格式&#xff08;Long Format&#xff09;和宽格式&#xff08;Wide Format&#xff09;&#xff0c;以及如何使用tidyr包进行…...

多模态大模型开启AI社交新纪元,Soul App创始人张璐团队亮相2024 GITEX GLOBAL

随着AI在全球范围内的加速发展和广泛应用,各行业纷纷在此领域发力。作为全球最大的科技盛会之一,2024年的GITEX GLOBAL将目光再次聚焦于人工智能的飞速发展,吸引了超过6700家来自各个领域的企业参与。在这样的背景下,Soul App作为国内较早将AI技术应用于社交领域的平台,首次亮相…...

实验6记录网络与故障排除

实验6记录网络与故障排除 实验目的及要求&#xff1a; 通过实验&#xff0c;掌握如何利用文档记录网络设备相关信息并完成网络拓扑结构的绘制。能够使用各种技术和工具来找出连通性问题&#xff0c;使用文档来指导故障排除工作&#xff0c;确定具体的网络问题&#xff0c;实施…...

QEMU 模拟器中运行的 Linux 系统

这两个文件通常用于在 QEMU 模拟器中运行的 Linux 系统&#xff0c;具体作用如下&#xff1a; 1. linux-aarch64-qemu.ext4&#xff1a; - **文件类型**&#xff1a;这是一个文件系统镜像文件&#xff0c;通常是 ext4 文件系统格式。 - **作用**&#xff1a;它包含了 Li…...

Ceph PG(归置组)的状态说明

Ceph PG&#xff08;Placement Group&#xff09;的状态反映了Ceph集群中数据的健康状况和分布情况。以下是Ceph PG的一些常见状态&#xff1a; Creating&#xff1a;创建状态。在创建存储池时&#xff0c;会创建指定数量的归置组&#xff08;PG&#xff09;。Ceph在创建一或多…...

Docker使用docker-compose一键部署nacos、Mysql、redis

下面是一个简单的例子&#xff0c;展示如何通过Docker Compose文件部署Nacos、MySQL和Redis。请确保您的机器上已经安装了Docker和Docker Compose。 1&#xff0c;准备好mysql、redis、nacos镜像 sudo docker pull mysql:8 && sudo docker pull redis:7.2 &&…...

3PEAK思瑞浦 LM324A-SR SOP14 运算放大器

特性 供电电压:3V至36V 低供电电流:每通道100A 输入共模电压范围包含地线: 可作为比较器工作 轨到轨输出 带宽:0.9MHz 斜率:0.5V/us 优异的EMI抑制性能:1GHz时71dB 偏移电压:最大3mV 偏移电压温度漂移:7V/C 工作温度范围:-40C至125C...

用STM32F401的I2S接口驱动TM8211 DAC播放WAV音频,保姆级CubeMX配置教程

基于STM32F401的TM8211音频播放系统开发指南 1. 硬件系统搭建与原理分析 在开始CubeMX配置之前&#xff0c;我们需要先理解整个音频播放系统的硬件架构和工作原理。STM32F401通过I2S接口与TM8211 DAC芯片通信&#xff0c;将数字音频信号转换为模拟信号&#xff0c;最终驱动扬…...

【紧急预警】Perplexity v3.2+图谱查询API行为突变:4类高危误用场景及24小时内修复方案

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity知识图谱查询 Perplexity 是一款基于大语言模型的实时知识检索工具&#xff0c;其底层融合了多源结构化知识图谱与动态网页索引能力&#xff0c;支持对实体、关系及事件进行语义化查询。不同于传统…...

鸿蒙心理测评模块实战|PHQ-9/GAD7双量表答题、实时计分与结果本地化存储

一、前言 心晴驿站已正式稳定上架华为应用市场&#xff0c;所有专栏内容均基于线上真实版本复盘产出&#xff0c;所有逻辑、代码、优化方案均通过真机测试、性能校验、隐私合规审核&#xff0c;具备完整落地与参赛复用价值。 在前八篇专栏中&#xff0c;我们完成了项目整体架构…...

Scandit Barcode Scanner:这家瑞士公司的SDK,如何让淘宝、京东的扫码快人一步?

Scandit Barcode Scanner&#xff1a;解码瑞士技术如何重塑全球扫码体验 在移动互联网时代&#xff0c;扫码已成为连接物理世界与数字世界的无形桥梁。从超市收银台到物流仓库&#xff0c;从零售门店到电商平台&#xff0c;条码扫描技术默默支撑着现代商业的高效运转。而在这背…...

MIT Cheetah-Software编译手记:搞定Qt5.10.0路径、LCM依赖与那些诡异的C++报错

MIT Cheetah-Software编译实战&#xff1a;Qt路径配置、LCM依赖与C报错深度解析 1. 环境准备与依赖管理 在Ubuntu 20.04环境下编译MIT Cheetah-Software&#xff0c;首先需要确保系统基础环境配置正确。不同于普通开源项目&#xff0c;这个四足机器狗的控制系统对Qt版本、LCM消…...

别再手动算潮流了!用MATLAB+Matpower搞定IEEE标准算例(附完整代码)

电力系统潮流计算实战&#xff1a;MATLABMatpower高效解决方案 在电力系统分析与设计中&#xff0c;潮流计算是最基础却至关重要的环节。传统的手工计算方式不仅耗时费力&#xff0c;而且难以应对复杂网络结构的分析需求。本文将带您探索如何利用MATLAB平台上的Matpower工具包&…...

别再问客服了!手把手教你用VNC在AutoDL GPU服务器上跑起你的第一个GUI程序

云端GPU服务器VNC实战&#xff1a;从零部署GUI开发环境全指南 租用云GPU服务器进行深度学习训练已成为算法工程师的常态&#xff0c;但当代码涉及图形界面时&#xff0c;许多开发者会在cv2.imshow()或PyQt窗口弹出的环节卡壳。本文将基于AutoDL平台&#xff0c;详解如何通过Tur…...

不止于解题:聊聊猪圈密码、圣堂武士密码和标准银河字母背后的历史与趣闻

不止于解题&#xff1a;猪圈密码、圣堂武士密码与标准银河字母的文化考古 当你在CTF竞赛中第一次遇到那些神秘的几何符号时&#xff0c;是否曾好奇过这些图形背后的故事&#xff1f;从共济会的秘密集会到《我的世界》游戏中的彩蛋&#xff0c;图形密码早已超越了单纯的加密工具…...

法律文书分析系统接入 A-MEM 长程记忆

项目实训 | Vue3 FastAPI | NeurIPS 2025 A-MEM 复现与工程落地一、背景与动机 在法律文书智能分析系统的开发过程中&#xff0c;我们发现了一个核心痛点&#xff1a;AI助手没有"记忆"。 用户在第一轮对话里详细描述了案件事实——“我是原告张三&#xff0c;2024年…...