Spring Boot 的生命周期

news2024/11/14 1:25:38

        Spring Boot的生命周期非常丰富,包含了从初始化到运行再到关闭的各个阶段。每个阶段都有其特定的任务和事件,开发者可以利用这些生命周期的特性来更好地控制应用的行为。

初始化阶段 (Initialization Phase)

     1. 构造 SpringApplication 对象

           当调用 SpringApplication.run(...) 方法时,Spring Boot 会创建一个 SpringApplication 实例。这个实例是整个应用启动的核心。以下是创建 SpringApplication 实例的代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}
           1.1 配置 SpringApplication 对象

       SpringApplication 提供了许多配置选项,例如设置应用的名称、监听器、初始化器等。例如,可以设置应用的显示名称:

SpringApplication app = new SpringApplication(MyApp.class);
app.setBannerMode(Banner.Mode.OFF);  
app.run(args);
            1.2 准备环境

                     初始化环境变量:Spring Boot 会自动加载系统属性和环境变量。

                     创建 ConfigurableEnvironment:创建一个 StandardEnvironment 对象,该对象负责加载 application.properties 或 application.yml 文件中的配置。

                      监听器初始化:Spring Boot 会初始化 SpringApplicationRunListener,这些监听器会在应用的各个生命周期点被调用。

运行阶段 (Running Phase)

     2. 创建 ApplicationContext

           根据应用类型(Servlet, 响应式 Web 应用(Reactive)以及非 Web 应用(None)),Spring Boot 会选择合适的 ApplicationContext 类型。例如,对于 Web 应用,它会创建 AnnotationConfigServletWebServerApplicationContext

          2.1 应用初始器

                   在 ApplicationContext 刷新之前,Spring Boot 会调用所有注册的 ApplicationContextInitializer。开发者可以通过实现 ApplicationContextInitializer 接口来定制 ApplicationContext 的初始化过程。例如:

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        // 自定义初始化逻辑
    }
}
           2.2 加载配置

                    加载主类:Spring Boot 会加载带有 @SpringBootApplication 注解的主类。

                    自动配置:通过 @EnableAutoConfiguration 注解,Spring Boot 会根据类路径中的依赖自动配置应用。

                     组件扫描:通过 @ComponentScan 注解,Spring Boot 会扫描并注册主类所在包及其子包下的所有组件。

            2.3 刷新上下文

                     Bean 定义加载:Spring Boot 会加载所有的 Bean 定义,包括 XML 配置文件和注解配置。

                     Bean 实例化:实例化所有非懒加载的单例 Bean。

                     Bean 初始化:调用 Bean 的初始化方法(如 @PostConstruct 方法)。

                     Bean 后处理:执行 Bean 的后处理(如 BeanPostProcessor)。

                     发布 ContextRefreshedEvent:当 ApplicationContext 完成刷新时,会发布 ContextRefreshedEvent 事件。

             2.4 启动 Web 服务器

                      如果是 Web 应用,Spring Boot 会启动嵌入式的 Web 服务器(例如 Tomcat、Jetty 或 Undertow)。例如,Tomcat 服务器的启动过程包括初始化 Servlet 容器、注册 Servlet 和 Filter、启动 HTTP 端口等。

             2.5 执行 ApplicationRunner 和 CommandLineRunner

                       当 ApplicationContext 刷新完成后,Spring Boot 会查找并执行实现了 ApplicationRunnerCommandLineRunner 接口的 Bean。这些 Bean 通常用于执行启动后的初始化任务。例如:

@Component
public class MyApplicationRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 启动后的初始化任务
    }
}

@Component
public class MyCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        // 启动后的初始化任务
    }
}
                2.6 发布 ApplicationReadyEvent

                          当应用准备好接收流量时,Spring Boot 会发布 ApplicationReadyEvent 事件。这表明应用已经完全启动,并且可以处理外部请求。

结束阶段 (Shutdown Phase)

    3. 应用关闭

         关闭 Web 服务器:如果是 Web 应用,Spring Boot 会关闭嵌入式的 Web 服务器。

         销毁 Bean:销毁所有的单例 Bean,调用 Bean 的销毁方法(如 @PreDestroy 方法)。

         关闭 ApplicationContext:调用 ApplicationContext 的 close 方法,发布 ContextClosedEvent 事件。

         发布 ApplicationShutdownEvent:发布应用关闭事件,通知监听器应用即将关闭。

生命周期事件 (Lifecycle Events)

        Spring Boot 应用程序在其生命周期中会发布多个事件,开发者可以通过实现 ApplicationListener 接口来监听这些事件,并在事件发生时执行自定义逻辑。以下是一些重要的生命周期事件:

      ApplicationStartingEvent:应用启动时的第一个事件。

      ApplicationEnvironmentPreparedEvent:环境准备完成后触发。

      ApplicationPreparedEvent:应用上下文准备完成后触发。

      ApplicationStartedEvent:应用启动完成后触发。

      ApplicationReadyEvent:应用准备好接收请求时触发。

      ApplicationFailedEvent:应用启动失败时触发。

      ContextRefreshedEvent:应用上下文刷新完成后触发。

      ContextClosedEvent:应用上下文关闭时触发。

自定义生命周期行为

        开发者可以通过实现 ApplicationListener 接口来监听上述事件,并在事件触发时执行自定义逻辑。例如,监听 ApplicationReadyEvent 事件:

@Component
public class MyApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println("My application is now ready and running.");
        // 可以在这里执行额外的初始化逻辑
    }
}

       此外,你还可以通过实现 SpringApplicationRunListener 接口来监听整个应用启动过程中的更多事件。例如:

public class MySpringApplicationRunListener implements SpringApplicationRunListener {
    public MySpringApplicationRunListener(SpringApplication application, String[] args) {
        // 构造函数
    }

    @Override
    public void starting() {
        // 应用启动前
    }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
        // 环境准备完成后
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        // 上下文准备完成后
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        // 上下文加载完成后
    }

    @Override
    public void started(ConfigurableApplicationContext context) {
        // 应用启动完成后
    }

    @Override
    public void running(ConfigurableApplicationContext context) {
        // 应用运行中
    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        // 应用启动失败
    }
}

       通过实现这些接口,开发者可以在应用的生命周期中插入自定义逻辑,以满足特定的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

26.校园快递物流管理系统(基于SSM和Vue的Java项目)

目录 1.系统的受众说明 2.相关技术 2.1 JAVA简介 2.2 SSM三大框架 2.3 MyEclipse开发环境 2.4 Tomcat服务器 2.5 MySQL数据库 2.6访问数据库实现方法 3. 系统分析 3.1 需求分析 3.2 系统可行性分析 3.2.1技术可行性&#xff1a;技术背景 3.2.2经济可行性…

JAVA学习日记(十三)常用算法API+Lambda表达式

一、Arrays 操作数组的工具类 import java.util.Arrays; import java.util.Comparator;public class Main {public static void main(String[] args){int[] arrnew int[]{1,2,3,4,5,6,7,8,9};//将数组变为字符串 toStringSystem.out.println(Arrays.toString(arr)); //[1, 2, …

实现linux定时备份数据至群晖NAS

实现LINUX定期备份数据至NAS中 前置条件 linux群晖NAS 1.NAS准备工作 首先确保NAS系统已经处于配置成功的状态 在控制面板–>文件服务–>rsync下启用rsync服务 启用之后会生成一个NetBackup的文件夹 2.在linux系统中测试一下rsync的备份命令 rsync -av -e ssh /li…

redis用法(二)

文章目录 02-redis数据类型篇生产环境下的redis实况图 1.全局命令redis数据存储格式set设置k-v查看当前redis的key的数量危险命令&#xff0c;新手请在于超老师陪同下执行为什么危险&#xff1f;如何正确搜索redis的key 查看库下有多少个key查询redis库信息切换redis库查看key是…

STM32问题集

这里写目录标题 一、烧录1、 Can not connect to target!【ST-LINK烧录】 一、烧录 1、 Can not connect to target!【ST-LINK烧录】 烧录突然 If the target is in low power mode, please enable “Debug in Low Power mode” option from Target->settings menu 然后就&…

aspose如何获取PPT放映页“切换”的“持续时间”值

aspose如何获取PPT放映页“切换”的“持续时间”值 项目场景问题描述问题1&#xff1a;从官方文档和资料查阅发现并没有对切换的持续时间进行处理的方法问题2&#xff1a;aspose的依赖包中&#xff0c;所有的关键对象都进行了混淆处理 解决方案1、找到ppt切换的持续时间对应的混…

基于Python的药房管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【Linux】常用命令(2.6万字汇总)

文章目录 Linux常用命令汇总1. 基础知识1.1. Linux系统命令行的含义1.2. 命令的组成 2. 基础知识2.1. 关闭系统2.2. 关闭重启2.3. 帮助命令&#xff08;help&#xff09;2.4. 命令说明书&#xff08;man&#xff09;2.5. 切换用户&#xff08;su&#xff09;2.6.历史指令 3.目录…

wps导出图片图片特别多怎么进行排序,并且全部进行统一的修改名称

问题展示 想实现的效果 根据顺序变成数字顺序&#xff0c;方便后期自己页面开发的渲染 先确保自己有node环境电脑安装了node再创建一个index.js文件这个文件放在你导出文件的内 js内容 const fs require(fs); const path require(path);// 设置文件夹路径 const folderPat…

Ubuntu 的 ROS2 操作系统turtlebot3环境搭建

引言 本文介绍如何在 Ubuntu 系统上为 TurtleBot3 配置 ROS2 环境&#xff0c;提供详细的操作步骤以便在 PC 端控制 TurtleBot3。 本文适用于 ROS2 Humble 的安装与配置&#xff0c;涵盖必要的依赖包和 Gazebo 仿真环境的设置&#xff0c;帮助用户避免在环境搭建过程中遇到的兼…

区块链技术在慈善捐赠中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在慈善捐赠中的应用 区块链技术在慈善捐赠中的应用 区块链技术在慈善捐赠中的应用 引言 区块链技术概述 定义与原理 发…

C++ | Leetcode C++题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; class Solution { public:int nextGreaterElement(int n) {int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 …

MySql-8.0.40安装详细教程

文章目录 原创下载安装包安装配置初始化MySQL数据库安装mysql服务并启动启动MySQL服务连接MySQL配置环境变量 原创 MySql-8.0.26安装详细教程&#xff08;保姆级&#xff09; 下载安装包 MySQL Community Downloads 直接到选择MySQL Community Server版本页面 MySQL Commun…

算法学习第一弹——C++基础

早上好啊&#xff0c;大佬们。来看看咱们这回学点啥&#xff0c;在前不久刚出完C语言写的PTA中L1的题目&#xff0c;想必大家都不过瘾&#xff0c;感觉那些题都不过如此&#xff0c;所以&#xff0c;为了我们能更好的去处理更难的题目&#xff0c;小白兔决定奋发图强&#xff0…

vue2 -- el-form组件动态增减表单项及表单项验证

需求 在数据录入场景(如订单信息录入)中,可根据实际情况(如商品种类增加)动态添加表单项(如商品相关信息)。包含必填项验证和数据格式验证(如邮箱、电话格式),防止错误数据提交。 效果 代码一 <template><div>

【GPTs】Get Simpsonized:一键变身趣味辛普森角色

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Get Simpsonized主要功能适用场景优点缺点使用方式 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; 指令保护和安全规则&…

丹摩征文活动|CogVideoX-2b:从安装到上线,轻松搞定全过程!

CogVideoX-2b&#xff1a;从安装到上线&#xff0c;轻松搞定全过程&#xff01; CogVideoX简介 CogVideoX的推出标志着视频生成技术的一次重大突破。过去&#xff0c;如何在保持高效的同时提升视频质量一直是一个难题&#xff0c;但CogVideoX 通过其先进的3D变分自编码器&…

CocosCreator 构建透明背景应用(最新版!!!)

文章目录 透明原理补充设置截图以及代码step1: electron-js mian.jsstep2:ENABLE_TRANSPARENT_CANVASstep3:SOLID_COLOR Transparentstep:4 Build Web phonestep5:package electron-js & change body background-color 效果图补充 透明原理 使用Cocos creator 做桌面应用开…

【H2O2|全栈】JS案例章节(三)——轮播图实现

目录 前言 开篇语 准备工作 需求 HTML和CSS 注意事项 原生JS实现 变量设置 方法设置 自动轮播与轮播销毁 翻页按钮 li点击切换指定图片 JQuery实现 变量设置 方法设置 自动轮播与轮播销毁 翻页按钮 li点击切换指定图片 结束语 前言 开篇语 本系列为短章节…

Vivado+Vscode联合打造verilog环境

一、Vivado下载安装 详细参考我另一篇文章&#xff1a; Vivado2022.2下载安装_fpga vivado下载-CSDN博客https://blog.csdn.net/weixin_61081689/article/details/143460790?spm1001.2014.3001.5501 二、Vscode下载安装 详细参考我另一篇文章&#xff1a; VscodeAnacond…