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

Spring 启动顺序

在 Spring 框架中,应用启动过程涉及多个步骤和组件的初始化。理解 Spring 启动顺序不仅有助于优化应用性能,还能帮助开发人员排查启动过程中可能出现的问题。本文将详细介绍 Spring 启动过程中的关键步骤和顺序。

1. Spring 启动过程概述

Spring 应用的启动过程大致可以分为以下几个阶段:

  1. 加载配置文件: 读取 application.propertiesapplication.yml 等配置文件。
  2. 创建 Spring 容器: 初始化 ApplicationContext
  3. Bean 定义加载: 通过扫描和配置文件加载 Bean 定义。
  4. Bean 实例化: 根据 Bean 定义创建 Bean 实例。
  5. 依赖注入: 将所需的依赖注入到 Bean 中。
  6. Bean 初始化: 调用初始化方法。
  7. 完成启动: 应用完全启动并准备好处理请求。

2. 详细启动步骤

2.1 加载配置文件

在启动阶段,Spring Boot 会首先加载配置文件。默认情况下,Spring Boot 会加载位于 src/main/resources 目录下的 application.propertiesapplication.yml 文件。

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

2.2 创建 Spring 容器

Spring 容器是 ApplicationContext 的实现类。常用的实现类有 AnnotationConfigApplicationContextClassPathXmlApplicationContextGenericWebApplicationContext。在 Spring Boot 中,通常使用 SpringApplication 类来创建容器。

ApplicationContext context = SpringApplication.run(MySpringBootApplication.class, args);

2.3 Bean 定义加载

Spring 容器会根据配置文件和注解扫描路径加载 Bean 定义。在这个阶段,Spring 解析配置文件中的 Bean 定义和注解(如 @Component@Service@Repository@Controller 等)。

@Configuration
@ComponentScan(basePackages = "com.example.myapp")
public class AppConfig {// Bean definitions
}

2.4 Bean 实例化

根据加载的 Bean 定义,Spring 容器会创建 Bean 的实例。实例化时,Spring 会处理构造函数和静态工厂方法。

@Bean
public MyService myService() {return new MyServiceImpl();
}

2.5 依赖注入

在 Bean 实例化之后,Spring 会进行依赖注入。依赖注入的方式包括构造函数注入、Setter 方法注入和字段注入。

@Component
public class MyController {@Autowiredprivate MyService myService;
}

2.6 Bean 初始化

在依赖注入完成后,Spring 会调用 Bean 的初始化方法。初始化方法可以通过实现 InitializingBean 接口的 afterPropertiesSet 方法或者使用 @PostConstruct 注解来定义。

@Component
public class MyBean implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {// Initialization logic}
}@Component
public class AnotherBean {@PostConstructpublic void init() {// Initialization logic}
}

2.7 完成启动

当所有 Bean 都被实例化并初始化后,Spring 容器会准备好处理请求。在 Spring Boot 应用中,这通常表示内嵌的 Tomcat 或其他服务器已经启动并准备好接受 HTTP 请求。

3. Spring Boot 特定的启动流程

在 Spring Boot 中,启动过程包括一些特定的步骤和增强功能:

  • SpringApplication.run(): 这个方法启动了一个 SpringApplication 实例,并触发整个启动过程。
  • SpringApplicationRunListeners: 监听应用启动事件,如环境准备、上下文准备和应用启动完成。
  • ConfigurableEnvironment: 准备环境配置,包括配置文件和环境变量。
  • ApplicationContextInitializer: 初始化应用上下文,可以在启动过程中自定义上下文的配置。
  • CommandLineRunner 和 ApplicationRunner: 在应用启动完成后执行自定义的逻辑。
@SpringBootApplication
public class MySpringBootApplication implements CommandLineRunner {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}@Overridepublic void run(String... args) throws Exception {// Custom logic after startup}
}

4. 自定义 Spring 启动流程

开发人员可以通过实现以下接口来自定义 Spring 的启动流程:

  • BeanFactoryPostProcessor: 在 BeanFactory 标准初始化之后修改其内部配置。
  • BeanPostProcessor: 在 Bean 初始化前后添加自定义逻辑。
  • ApplicationListener: 监听 Spring 应用中的事件,如上下文刷新、启动和关闭事件。
@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// Custom logic}
}@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// Custom logic before initializationreturn bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// Custom logic after initializationreturn bean;}
}

结语

理解 Spring 启动顺序对于开发高效、可靠的 Spring 应用至关重要。通过熟悉 Spring 启动过程中各个步骤和相关接口,开发人员可以优化启动流程,解决启动时可能遇到的问题,并根据需要自定义启动逻辑。这些知识在面试中也能展示出你对 Spring 框架的深入理解和实践经验。

相关文章:

Spring 启动顺序

在 Spring 框架中,应用启动过程涉及多个步骤和组件的初始化。理解 Spring 启动顺序不仅有助于优化应用性能,还能帮助开发人员排查启动过程中可能出现的问题。本文将详细介绍 Spring 启动过程中的关键步骤和顺序。 1. Spring 启动过程概述 Spring 应用的…...

2024.06.19 刷题日记

41. 缺失的第一个正数 这个题目的通过率很低,是一道难题,类似于脑筋急转弯,确实不好想。实际上,对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1,N1] 中。 这个结论并不好想,举个例子&#x…...

linux系统中,pwd获取当前路径,dirname获取上一层路径;不使用 ../获取上一层路径

在实际项目中,我们通常可以使用 pwd 来获取当前路径,但是如果需要获取上一层路径,有不想使用 …/ 的方式,可以尝试使用 dirname指令 测试shell脚本 #!/bin/bash# 获取当前路径 CURRENT_PATH$PWD echo "CURRENT_PATH$CURREN…...

DeepSpeed Monitoring Comm. Logging

Monitoring 支持多种后端:Tensorboard、WandB、Comet、CSV文件; TensorBoard例子: 自动监控:DeepSpeed自动把重要metric记录下来。只需在配置文件里enable相应的看板后端即可: {"tensorboard": {"enabl…...

关于INCA的几个实用功能

01--VUI窗口设计 这个可以按照自己的想法设计INCA观测或标定窗口 首先进入到INCA的环境内,点击实验→加载VUI窗口 选择空的窗口 打开后如下所示: 点击UI开发模式,如下图 如下: 添加标定量、观测量、示波器 窗口的大小需要在开发…...

Mamaba3--RNN、状态方程、勒让德多项式

Mamaba3–RNN、状态方程、勒让德多项式 一、简单回顾 在Mamba1和Mamba2中分别介绍了RNN和状态方程。 下面从两个图和两个公式出发,对RNN和状态方程做简单的回顾: R N N : s t W s t − 1 U x t ; O t V s t RNN: s_t Ws_{t-1}Ux_t&…...

PLC模拟量和数字量到底有什么区别?

PLC模拟量和数字量的区别 在工业自动化领域,可编程逻辑控制器(PLC)是控制各种机械设备和生产过程的核心组件。PLC通过处理模拟量和数字量来实现对工业过程的精确控制。了解模拟量和数字量的区别对于设计高效、可靠的自动化系统至关重要。 1. …...

html中如何写一个提示框,css画一个提示框

在HTML中&#xff0c;提示框通常使用<div>元素来创建&#xff0c;然后使用CSS进行样式化。以下是一个示例&#xff0c;展示如何在HTML中写一个提示框&#xff0c;并使用CSS来设计其外观。 HTML 首先&#xff0c;创建一个HTML文件&#xff0c;其中包含一个提示框的结构&…...

ExoPlayer 学习笔记

https://www.51cto.com/article/777840.html ExoPlayer支持多种媒体格式和流媒体协议的播放器 播放视频&#xff1a;player.play()暂停视频&#xff1a;player.pause()停止播放&#xff1a;player.stop() Media3 ExoPlayer | Android media | Android Developers implem…...

汽车IVI中控开发入门及进阶(二十七):车载摄像头vehicle camera

前言: 在车载IVI、智能座舱系统中,有一个重要的应用场景就是视频。视频应用又可分为三种,一种是直接解码U盘、SD卡里面的视频文件进行播放,一种是手机投屏,就是把手机投屏软件已视频方式投屏到显示屏上显示,另外一种就是对视频采集设备(主要就是摄像头Camera)的视频源…...

Transformer模型:未来的改进方向与潜在影响

Transformer模型&#xff1a;未来的改进方向与潜在影响 自从2017年Google的研究者们首次提出Transformer模型以来&#xff0c;它已经彻底改变了自然语言处理&#xff08;NLP&#xff09;领域的面貌。Transformer的核心优势在于其“自注意力&#xff08;Self-Attention&#xf…...

ROS 激光雷达

ROS 激光雷达 基本工作原理 激光雷达&#xff08;LIDAR&#xff0c;Light Detection and Ranging&#xff09;是一种用于测量距离的远程感应技术。它通过向目标发射激光并分析反射回来的光来测量目标与激光发射源之间的距离。激光雷达广泛应用于多种领域&#xff0c;包括地理…...

杂说咋说-关于城市化发展和城市治理的几点建议(浙江借鉴)

杂说咋说-关于城市化发展和城市治理的几点建议&#xff08;浙江借鉴&#xff09; 近年来&#xff0c;浙江省坚持一张蓝图绘到底&#xff0c;推动城市化发展和城市治理不断迈上新台阶&#xff0c;全省城市化水平和城市治理能力牢牢居于全国第一方阵。当前&#xff0c;国内外环境…...

Linux 常用命令 - which【定位可执行文件的位置】

简介 which 命令源自于英文单词 "which"&#xff0c;用于在环境变量 PATH 所指定的路径中搜索某个可执行文件或链接&#xff08;如一个系统命令&#xff09;的位置&#xff0c;并返回第一个搜索结果。这个命令会遍历 PATH 环境变量中的所有路径&#xff0c;直到找到…...

js文件导出功能

效果图&#xff1a; 代码示例&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>html 表格导出道</title><script src"js/jquery-3.6.3.js"></script><st…...

PHP转Go系列 | 字符串的使用姿势

大家好&#xff0c;我是码农先森。 输出 在 PHP 语言中的输出比较简单&#xff0c;直接使用 echo 就可以。此外&#xff0c;在 PHP 中还有一个格式化输出函数 sprintf 可以用占位符替换字符串。 <?phpecho 码农先森; echo sprintf(码农:%s, 先森);在 Go 语言中调用它的输…...

vue关于:deep穿透样式的理解

情况一 子组件&#xff1a; <div class"child"><div class"test_class">test_class<div class"test1">test1<div class"test2">test2</div></div></div></div>父组件&#xff1a; …...

算法 |数字计数

给出n个数字,请你求出在给出的这n个数字当中,最大的数字与次大的数字之差,最大的数字与次小的数字之差,次大的数字与次小的数字之差,次大的数字与最小的数字之差. 易错点 1 1 2 3 4 4 次小不是a[1]了 次大也不是a[n-2]了 #include<bits/stdc.h> using namespace std; …...

通义千问调用笔记

如何使用通义千问API_模型服务灵积(DashScope)-阿里云帮助中心 package com.ruoyi.webapp.utils;import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationOutput; import com.alibaba.dashscope.aigc.generation.G…...

Linux常见的压缩文件种类与对应的压缩解压方法

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...