当前位置: 首页 > 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;共同学习进步。…...

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、编译安装…...

排序算法及源代码

堆排序&#xff1a; 在学习堆之后我们知道了大堆和小堆&#xff0c;对于大堆而言第一个节点就是对大值&#xff0c;对于小堆而言&#xff0c;第一个值就是最小的值。如果我们把第一个值与最后一个值交换再对最后一个值前面的数据重新建堆&#xff0c;如此下去就可以实现建堆排…...

力扣第206题“反转链表”

在本篇文章中&#xff0c;我们将详细解读力扣第206题“反转链表”。通过学习本篇文章&#xff0c;读者将掌握如何使用迭代和递归的方法来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。 问题描述 力扣第…...

多模态大模型解读

目录 1. CLIP 2. ALBEF 3. BLIP 4. BLIP2 参考文献 &#xff08;2023年&#xff09;视觉语言的多模态大模型的目前主流方法是&#xff1a;借助预训练好的LLM和图像编码器&#xff0c;用一个图文特征对齐模块来连接&#xff0c;从而让语言模型理解图像特征并进行深层次的问…...

React是什么?

theme: condensed-night-purple highlight: atelier-cave-light React是什么&#xff1f; 官方的解释是&#xff1a;A JavaScript library for building user interfaces用于构建用户界面的 JavaScript 库 那为什么要选择用React呢&#xff1f; 原生的HTML、CSS、JavaScrip的…...

创新入门 | 病毒循环Viral Loop是什么?为何能实现指数增长

今天&#xff0c;很多高速增长的成功创业公司都在采用”病毒循环“的策略去快速传播、并扩大用户基础。究竟什么是“病毒循环”&#xff1f;初创公司的创始人为何需要重视这个策略&#xff1f;这篇文章中将会一一解答与病毒循环有关的各种问题。 一、什么是病毒循环&#xff08…...

鸿蒙HarmonyOS实战:渲染控制、路由案例

条件渲染 简单来说&#xff0c;就是动态控制组件的显示与隐藏&#xff0c;类似于vue中的v-if 但是这里写法就是用if、else、else if看起来更像是原生的感觉 效果 循环渲染 我们实际开发中&#xff0c;数据一般是后端返回来的对象格式&#xff0c;对此我们需要进行遍历&#…...

【Linux】进程控制2——进程等待(waitwaitpid)

1. 进程等待必要性 我们知道&#xff0c;子进程退出&#xff0c;父进程如果不管不顾&#xff0c;就可能造成"僵尸进程”的问题&#xff0c;进而造成内存泄漏。另外&#xff0c;进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff0c;“杀人不眨眼”的kill -9 也无能为…...

SpringBoot 统计接口调用耗时的多种方式

在实际开发中&#xff0c;了解项目中接口的响应时间是必不可少的事情。SpringBoot 项目支持监听接口的功能也不止一个&#xff0c;接下来我们分别以 AOP、ApplicationListener、Tomcat 三个方面去实现三种不同的监听接口响应时间的操作。 AOP 首先我们在项目中创建一个类 &am…...

Linux系统安装Ruby语言

Ruby是一种面向对象的脚本语言&#xff0c;由日本的计算机科学家松本行弘设计并开发&#xff0c;Ruby的设计哲学强调程序员的幸福感&#xff0c;致力于简化编程的复杂性&#xff0c;并提供一种既强大又易于使用的工具。其语法简洁优雅&#xff0c;易于阅读和书写&#xff0c;使…...

求网站资源懂的2021/seo的关键词无需

引入其他字体库&#xff0c; 如Open Sans&#xff0c;先下载Open Sans字体http://pan.baidu.com/s/1c1S8ZC0font-face {font-family: Open Sans; /* 为导入的字体命名(自定义)&#xff0c;方便以后使用 */src: url(font/OpenSans-Light.ttf); /* 导入字体库 */ } p{font-famil…...

网址建站/百度推广后台登录入口

为什么80%的码农都做不了架构师&#xff1f;>>> 一、哈希函数的构造方法 构造哈希函数的原则是&#xff1a; ①函数本身便于计算&#xff1b;②计算出来的地址分布均匀&#xff0c;即对任一关键字k&#xff0c;f(k) 对应不同地址的概率相等&#xff0c;目的是尽可能…...

用PS怎么做网站界面/产品软文案例

题目描述 “别人总说我瓜&#xff0c;其实我一点也不瓜&#xff0c;大多数时候我都机智的一批“ 宝儿姐考察你一道很简单的题目。给你一个数字串&#xff0c;你能判断有多少个连续子串能整除3吗&#xff1f;输入 多实例输入&#xff0c;以EOF结尾&#xff0c;每行一个数字串&am…...

拍卖网站建设公司/企业门户网站

题意 你需要维护若干连通快&#xff0c;有两个操作 合并\(x,y\)所在的连通块询问\(x\)所在连通块中权值从小到大排第\(k\)的结点编号题解 可以启发式合并\(splay\)&#xff0c;感觉比较好些的 一个连通块就是一个\(splay\)&#xff0c;每次合并挑小的\(splay\)遍历一遍把点按中…...

重庆网站建设哪里比较好呢/站长之家ppt素材

本文目的上一章节已经详细的向大家介绍过排序的相关概念(详见学习笔记-排序简单介绍) &#xff0c;本文旨在为大家详细的介绍归并排序。归并排序归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已…...

web产品销售网站开发/站长工具 忘忧草

研究框架系列合规声明&#xff1a;本文节选自正式入库研究报告。转自&#xff1a;计算机文艺复兴 公众号&#xff0c;本次转载仅供学习&#xff1b;‍‍END版权声明&#xff1a;本号内容部分来自互联网&#xff0c;转载请注明原文链接和作者&#xff0c;如有侵权或出处有误请和…...