Spring 启动顺序
在 Spring 框架中,应用启动过程涉及多个步骤和组件的初始化。理解 Spring 启动顺序不仅有助于优化应用性能,还能帮助开发人员排查启动过程中可能出现的问题。本文将详细介绍 Spring 启动过程中的关键步骤和顺序。
1. Spring 启动过程概述
Spring 应用的启动过程大致可以分为以下几个阶段:
- 加载配置文件: 读取
application.properties
或application.yml
等配置文件。 - 创建 Spring 容器: 初始化
ApplicationContext
。 - Bean 定义加载: 通过扫描和配置文件加载 Bean 定义。
- Bean 实例化: 根据 Bean 定义创建 Bean 实例。
- 依赖注入: 将所需的依赖注入到 Bean 中。
- Bean 初始化: 调用初始化方法。
- 完成启动: 应用完全启动并准备好处理请求。
2. 详细启动步骤
2.1 加载配置文件
在启动阶段,Spring Boot 会首先加载配置文件。默认情况下,Spring Boot 会加载位于 src/main/resources
目录下的 application.properties
或 application.yml
文件。
@SpringBootApplication
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}
}
2.2 创建 Spring 容器
Spring 容器是 ApplicationContext
的实现类。常用的实现类有 AnnotationConfigApplicationContext
、ClassPathXmlApplicationContext
和 GenericWebApplicationContext
。在 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 框架的深入理解和实践经验。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
Spring 启动顺序
在 Spring 框架中,应用启动过程涉及多个步骤和组件的初始化。理解 Spring 启动顺序不仅有助于优化应用性能,还能帮助开发人员排查启动过程中可能出现的问题。本文将详细介绍 Spring 启动过程中的关键步骤和顺序。 1. Spring 启动过程概述 Spring 应用的…...
![](https://www.ngui.cc/images/no-images.jpg)
2024.06.19 刷题日记
41. 缺失的第一个正数 这个题目的通过率很低,是一道难题,类似于脑筋急转弯,确实不好想。实际上,对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1,N1] 中。 这个结论并不好想,举个例子&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
linux系统中,pwd获取当前路径,dirname获取上一层路径;不使用 ../获取上一层路径
在实际项目中,我们通常可以使用 pwd 来获取当前路径,但是如果需要获取上一层路径,有不想使用 …/ 的方式,可以尝试使用 dirname指令 测试shell脚本 #!/bin/bash# 获取当前路径 CURRENT_PATH$PWD echo "CURRENT_PATH$CURREN…...
![](https://img-blog.csdnimg.cn/direct/1b7c0ec0f2d440e3a590e0496de2a1e1.png)
DeepSpeed Monitoring Comm. Logging
Monitoring 支持多种后端:Tensorboard、WandB、Comet、CSV文件; TensorBoard例子: 自动监控:DeepSpeed自动把重要metric记录下来。只需在配置文件里enable相应的看板后端即可: {"tensorboard": {"enabl…...
![](https://img-blog.csdnimg.cn/direct/66d9aee731aa40c4830a5f6f0f6f5eaf.png)
关于INCA的几个实用功能
01--VUI窗口设计 这个可以按照自己的想法设计INCA观测或标定窗口 首先进入到INCA的环境内,点击实验→加载VUI窗口 选择空的窗口 打开后如下所示: 点击UI开发模式,如下图 如下: 添加标定量、观测量、示波器 窗口的大小需要在开发…...
![](https://img-blog.csdnimg.cn/direct/3ad539227d3f42f8959c05b034b275ce.png)
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&…...
![](https://img-blog.csdnimg.cn/img_convert/0ed0b504ec0ff27a5cafa71380ac4c60.png)
PLC模拟量和数字量到底有什么区别?
PLC模拟量和数字量的区别 在工业自动化领域,可编程逻辑控制器(PLC)是控制各种机械设备和生产过程的核心组件。PLC通过处理模拟量和数字量来实现对工业过程的精确控制。了解模拟量和数字量的区别对于设计高效、可靠的自动化系统至关重要。 1. …...
![](https://www.ngui.cc/images/no-images.jpg)
html中如何写一个提示框,css画一个提示框
在HTML中,提示框通常使用<div>元素来创建,然后使用CSS进行样式化。以下是一个示例,展示如何在HTML中写一个提示框,并使用CSS来设计其外观。 HTML 首先,创建一个HTML文件,其中包含一个提示框的结构&…...
![](https://www.ngui.cc/images/no-images.jpg)
ExoPlayer 学习笔记
https://www.51cto.com/article/777840.html ExoPlayer支持多种媒体格式和流媒体协议的播放器 播放视频:player.play()暂停视频:player.pause()停止播放:player.stop() Media3 ExoPlayer | Android media | Android Developers implem…...
![](https://img-blog.csdnimg.cn/direct/436eff3b14834310ac7611d77710d8be.png)
汽车IVI中控开发入门及进阶(二十七):车载摄像头vehicle camera
前言: 在车载IVI、智能座舱系统中,有一个重要的应用场景就是视频。视频应用又可分为三种,一种是直接解码U盘、SD卡里面的视频文件进行播放,一种是手机投屏,就是把手机投屏软件已视频方式投屏到显示屏上显示,另外一种就是对视频采集设备(主要就是摄像头Camera)的视频源…...
![](https://img-blog.csdnimg.cn/direct/c4f4ef577e4e461a8a8741ed6f9dd340.png)
Transformer模型:未来的改进方向与潜在影响
Transformer模型:未来的改进方向与潜在影响 自从2017年Google的研究者们首次提出Transformer模型以来,它已经彻底改变了自然语言处理(NLP)领域的面貌。Transformer的核心优势在于其“自注意力(Self-Attention…...
![](https://www.ngui.cc/images/no-images.jpg)
ROS 激光雷达
ROS 激光雷达 基本工作原理 激光雷达(LIDAR,Light Detection and Ranging)是一种用于测量距离的远程感应技术。它通过向目标发射激光并分析反射回来的光来测量目标与激光发射源之间的距离。激光雷达广泛应用于多种领域,包括地理…...
![](https://img-blog.csdnimg.cn/direct/0d447630fcae47969466873dd09981df.png)
杂说咋说-关于城市化发展和城市治理的几点建议(浙江借鉴)
杂说咋说-关于城市化发展和城市治理的几点建议(浙江借鉴) 近年来,浙江省坚持一张蓝图绘到底,推动城市化发展和城市治理不断迈上新台阶,全省城市化水平和城市治理能力牢牢居于全国第一方阵。当前,国内外环境…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux 常用命令 - which【定位可执行文件的位置】
简介 which 命令源自于英文单词 "which",用于在环境变量 PATH 所指定的路径中搜索某个可执行文件或链接(如一个系统命令)的位置,并返回第一个搜索结果。这个命令会遍历 PATH 环境变量中的所有路径,直到找到…...
![](https://img-blog.csdnimg.cn/direct/ba4551442dfd47f39ffed25416e34644.png)
js文件导出功能
效果图: 代码示例: <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>html 表格导出道</title><script src"js/jquery-3.6.3.js"></script><st…...
![](https://img-blog.csdnimg.cn/img_convert/6dddb74d0445bf8c893451fc575b0d55.png)
PHP转Go系列 | 字符串的使用姿势
大家好,我是码农先森。 输出 在 PHP 语言中的输出比较简单,直接使用 echo 就可以。此外,在 PHP 中还有一个格式化输出函数 sprintf 可以用占位符替换字符串。 <?phpecho 码农先森; echo sprintf(码农:%s, 先森);在 Go 语言中调用它的输…...
![](https://img-blog.csdnimg.cn/direct/86cdc1721cf34316beddc3bd33c7479b.png)
vue关于:deep穿透样式的理解
情况一 子组件: <div class"child"><div class"test_class">test_class<div class"test1">test1<div class"test2">test2</div></div></div></div>父组件: …...
![](https://img-blog.csdnimg.cn/direct/69552e0b2ffa4ff584e462840fc90b5a.png)
算法 |数字计数
给出n个数字,请你求出在给出的这n个数字当中,最大的数字与次大的数字之差,最大的数字与次小的数字之差,次大的数字与次小的数字之差,次大的数字与最小的数字之差. 易错点 1 1 2 3 4 4 次小不是a[1]了 次大也不是a[n-2]了 #include<bits/stdc.h> using namespace std; …...
![](https://img-blog.csdnimg.cn/direct/db58c7d5a0994b759de3046ecfb1f432.png)
通义千问调用笔记
如何使用通义千问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…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux常见的压缩文件种类与对应的压缩解压方法
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
![](https://www.ngui.cc/images/no-images.jpg)
LNMP网站架构
一、安装nginx服务 1、关闭防火墙和核心防护 systemctl stop firewalld systemctl disable firewalld setenforce 0 2、安装依赖包 yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c make 3、创建运行用户 useradd -M -s /sbin/nologin nginx 4、编译安装…...
![](https://img-blog.csdnimg.cn/direct/b7b46b13ae24462c831ee05b8107b5de.png)
排序算法及源代码
堆排序: 在学习堆之后我们知道了大堆和小堆,对于大堆而言第一个节点就是对大值,对于小堆而言,第一个值就是最小的值。如果我们把第一个值与最后一个值交换再对最后一个值前面的数据重新建堆,如此下去就可以实现建堆排…...
![](https://www.ngui.cc/images/no-images.jpg)
力扣第206题“反转链表”
在本篇文章中,我们将详细解读力扣第206题“反转链表”。通过学习本篇文章,读者将掌握如何使用迭代和递归的方法来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述 力扣第…...
![](https://img-blog.csdnimg.cn/img_convert/8d13297e8bb8874a9d02dfd8535ec0a3.png)
多模态大模型解读
目录 1. CLIP 2. ALBEF 3. BLIP 4. BLIP2 参考文献 (2023年)视觉语言的多模态大模型的目前主流方法是:借助预训练好的LLM和图像编码器,用一个图文特征对齐模块来连接,从而让语言模型理解图像特征并进行深层次的问…...
![](https://www.ngui.cc/images/no-images.jpg)
React是什么?
theme: condensed-night-purple highlight: atelier-cave-light React是什么? 官方的解释是:A JavaScript library for building user interfaces用于构建用户界面的 JavaScript 库 那为什么要选择用React呢? 原生的HTML、CSS、JavaScrip的…...
![](https://img-blog.csdnimg.cn/img_convert/7cdbc92b0f929770a40d9f449c3384ff.png)
创新入门 | 病毒循环Viral Loop是什么?为何能实现指数增长
今天,很多高速增长的成功创业公司都在采用”病毒循环“的策略去快速传播、并扩大用户基础。究竟什么是“病毒循环”?初创公司的创始人为何需要重视这个策略?这篇文章中将会一一解答与病毒循环有关的各种问题。 一、什么是病毒循环(…...
![](https://img-blog.csdnimg.cn/direct/8939d548a4e14cf79861d11af83ee11b.png)
鸿蒙HarmonyOS实战:渲染控制、路由案例
条件渲染 简单来说,就是动态控制组件的显示与隐藏,类似于vue中的v-if 但是这里写法就是用if、else、else if看起来更像是原生的感觉 效果 循环渲染 我们实际开发中,数据一般是后端返回来的对象格式,对此我们需要进行遍历&#…...
![](https://img-blog.csdnimg.cn/direct/11b135cffe144cdf8ad4c6a84da369b2.png)
【Linux】进程控制2——进程等待(waitwaitpid)
1. 进程等待必要性 我们知道,子进程退出,父进程如果不管不顾,就可能造成"僵尸进程”的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为…...
![](https://www.ngui.cc/images/no-images.jpg)
SpringBoot 统计接口调用耗时的多种方式
在实际开发中,了解项目中接口的响应时间是必不可少的事情。SpringBoot 项目支持监听接口的功能也不止一个,接下来我们分别以 AOP、ApplicationListener、Tomcat 三个方面去实现三种不同的监听接口响应时间的操作。 AOP 首先我们在项目中创建一个类 &am…...
![](https://img-blog.csdnimg.cn/direct/a1d81ef526374ebab7809969911eebf2.png)
Linux系统安装Ruby语言
Ruby是一种面向对象的脚本语言,由日本的计算机科学家松本行弘设计并开发,Ruby的设计哲学强调程序员的幸福感,致力于简化编程的复杂性,并提供一种既强大又易于使用的工具。其语法简洁优雅,易于阅读和书写,使…...
![](https://img-blog.csdnimg.cn/6dda830f19d24dc7828d12aad25ee17f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbTBfMzc3NTk1OTA=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
钦州公司做网站/游戏推广公司靠谱吗
Edge浏览器主页被360劫持怎么办 ? 我出现的问题是在安装了360安全卫士之后,每次打开Edge浏览器,出现的都是360浏览器界面,全是一堆的垃圾广告和信息,太影响效率了。经查证,是Edge浏览器被360劫持了…...
![](/images/no-images.jpg)
linux主机 安装wordpress/深圳网络营销策划公司
同步自:http://www.blogjava.net/AndersLin/archive/2006/06/27/55421.html 上次发了一文《软件企业的绩效管理和内部消耗》讨论很多,"置身珠海,学习与奋斗"cnBlogs让我认识其实我说了那么多都只是绩效的保健性&…...
![](/images/no-images.jpg)
设计公司资质等级/北京朝阳区优化
前言:每次安装mysql都被烦的要死,痛并思痛记下此篇文章;参考:正文:1、下载mysql2、安装,下一步下一步即可!3、修改密码(1)执行 cd /usr/local/mysql/bin(2)执行 vim ~/.bash_profile在该文件中添…...
![](/images/no-images.jpg)
做网站推广员必备的条件/百度搜一搜
问:从北京邮电大学毕业的学生就业怎么样?值不值得报考?想要了解北京邮电大学毕业生就业具体情况详见>>>北京邮电大学总之,北京邮电大学就业率相对来说是比较良好的,如果大家对此学校感兴趣的话,可…...
![](/images/no-images.jpg)
健康服务管理中心/昆明网站seo优化
PHP三元运算符的使用方法技巧PHP是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛地运用。下面是小编为大家搜索整理的PHP三元运算符的使用方法技巧,希望能给大家带来帮助…...
![](https://2.bp.blogspot.com/-5wD9Vt5s1oY/WM-ArmJOeGI/AAAAAAAAyGE/ql1FnrrFC_gCoNDJqF8RV4idHEhCuMoPQCLcB/s640/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2017-03-19%2B%25E4%25B8%258B%25E5%258D%258810.38.49.png)
武汉做网站哪个好/腾讯企业qq官网
理解 SVG 中的 Viewport 和 ViewBox - 實做縮放(zoom)和拖曳(drag)效果 本文章同步刊載於 PJCHENder 前端網頁資源站 不同於以往將 SVG 視為一張圖案(ICON 或 LOGO)的概念,在這篇文章中…...