Springboot 容器启动之后初始化操作

news/2024/12/27 2:13:07/文章来源:https://www.cnblogs.com/plumsun/p/18517948

在项目开发中,有时候会在 Spring 应用启动后做一些初始化的操作,比如数据字典缓存,状态通知,配置读取等操作。
SpringBoot 提供了多种方式可以让开发者在容器启动后来执行一个任务:

  1. 使用 @PostConstruct 注解
  2. 通过 ApplicationListener 监听SpringBoot 启动过程中的发布的 Event 事件:
    • ContextRefreshedEvent
    • ApplicationReadyEvent
    • ApplicationStartedEvent
      .....
  3. 使用 ApplicationRunner、CommandLineRunner
  4. org.springframework.context.SmartLifecycle#start()


    image

执行优先级 @PostConstruct > SmartLifecycle.start() > ContextRefreshedEvent > ApplicationStartedEvent >ApplicationRunner > CommandLineRunner > ApplicationReadyEvent

@PostConstruct

@PostConstruct 是 JavaEE中的注解,全路径:javax.annotation.PostConstruct

Spring 会在 bean 的初始化(afterPropertiesSet)之后自动调用这个方法。通常用于执行初始化操作,例如连接资源、加载配置等。

官方注释:

The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization. This method must be invoked before the class is put into service. This annotation must be supported on all classes that support dependency injection.

PostConstruct 注解用于需要在完成依赖注入后执行以执行任何初始化的方法。在类投入使用之前,必须调用此方法。支持依赖项注入的所有类都必须支持此 Comments。

image

SmartLifecycle

SmartLifecycle 接口扩展了 Lifecycle 接口,具有自动启动和停止功能。start() 方法在应用程序启动时调用,通常用于启动和停止自定义组件,常用于管理后台任务、资源连接等。

  • isAutoStartup():返回是否自动启动,适用于需要延迟加载的组件。
  • start():在容器启动时调用。
  • stop():在容器关闭时调用。

Event

Spring 中在各个内部模块都有观察者模式的体现。简单介绍下跟本文相关的两个监听器:

  • ApplicationListener:是 Spring 中通用的事件监听器。主要用来监听 Spring 应用中的所有事件,包含框架内置和自定义的事件。比如:

    • ContextRefreshedEvent:当应用上下文被刷新时发布。通常在 @PostConstruct 之后调用,表示应用上下文已加载并完成初始化
    • ApplicationReadyEvent:表示应用已完全启动且准备就绪,可以接收请求。此事件在 CommandLineRunnerApplicationRunner 执行之后发布,常用于表示应用的最终启动完成。
    • ApplicationStartedEvent:当应用启动且环境和上下文准备完成,但在 CommandLineRunnerApplicationRunner 执行之前发布。可以用于执行在应用准备完成但未完全启动时的操作。
  • SpringApplicationRunListener:Spring Boot 内置的监听器,主要用于 SpringBoot 启动的整个过程。比如:初始化、环境准备、上下文准备和完全启动等多个阶段。

    • starting():在 run 方法首次启动时立即调用。可用于非常早期的初始化。
    • environmentPrepared():在准备好环境后但在创建环境之前 ApplicationContext 调用。
    • contextPrepared():在创建并准备 之后 ApplicationContext ,但在加载源之前调用。
    • contextLoaded():在加载应用程序上下文后但在刷新应用程序上下文之前调用。
    • started():上下文已刷新,应用程序已启动,但CommandLineRunnersApplicationRunners尚未被调用。
    • running():在 run 方法完成之前立即调用,此时应用程序上下文已刷新并且 all CommandLineRunners 和 ApplicationRunners 已被调用。
    • failed():在运行应用程序时发生故障时调用。

    上述方法都是 SpringApplicationRunListener 内置的方法。

image

ApplicationRunner、CommandLineRunner

两者都在Spring Boot应用启动完成且ApplicationContext已被完全初始化之后执行。

  • CommandLineRunner:实现此接口的 bean 会在 ApplicationContext 启动并完成所有 bean 的初始化后调用,适合执行启动后的一些自定义任务。
  • ApplicationRunner:与 CommandLineRunner 类似,但支持使用 ApplicationArguments 作为参数,可以更方便地访问应用启动参数。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAID

1.RAIDRAID0:最少1块硬盘、总容量=硬盘数x硬盘容量、没有数据冗余备份。坏1块则全部数据坏。但是读写性能很高RAID1:2块硬盘、总容量 = 总硬盘容量的一半、数据镜像备份。坏1块硬盘不影响全盘存储。读取性能提升,但写入性能略有降低RAID5:至少需要3块硬盘组成、总容量 = n-…

Mac系统安装node.js及环境配置

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18530322➤如果链接不是为敢技术的博客…

CF1909题解

CF1909A 一眼秒之题,我们发现就是四个方向选三个方向,若是存在一个点它的方向恰好在(0,0)点的另外一个方向,则一定不成立 枚举4个方向,发现有点在这个方向,显然选除这个点之外的三个方向的方案就不可行点击查看代码 #include<bits/stdc++.h> using namespace std…

AUTOSAR解决方案 — INTEWORK-EAS-AP

经纬恒润自主研发的Adaptive AUTOSAR平台产品, 遵循AUTOSAR Adaptive R19-11和R22-11规范, 使用C++11、C++17语言开发。可通过极易上手的自研工具配置,实现AUTOSAR AP协议栈代码快速生成。 随着汽车智能化、网联化以及汽车电子电气架构发展,汽车功能需求越发复杂,越…

Js Bom定时器、事件循环

BOM:浏览器对象模型BOM为我们提供了一组对象,通过这组对象可以完成对浏览器的各种操作BOM对象:Window —— 代表浏览器窗口(全局对象) Navigator —— 浏览器的对象(可以用来识别浏览器) Location —— 浏览器的地址栏信息 History —— 浏览器的历史记录(控制浏览器前进…

一步一步在 Blazor 里使用 npm

Blazor 目前不支持 node 语法,所以无法直接使用 node 包;所以需要再用 js 封装一层。1,先给 npm 建个目录 “NpmJS” ,因为 node 无法直接当作 js 使用,所以这个目录不需要建在 wwwroot 下,反而方便 csproj 管理 2,创建 node 项目,建议直接用 npm init 命令创建, vs 自…

合宙低功耗4G模组HTTP网络协议应用

​一、HTTP概述 1.1 简介 HTTP是HyperTextTransferProtocol(超文本传输协议)的缩写。HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说…

基于ESP32的桌面小屏幕实战[2]:硬件设计之充电管理

1. 硬件基础知识 1.1 原理图设计、PCB设计、PCB(电路板)、PCBA(电路板+元器件)分别长什么样?1.2 高低电平 一般可以理解为输出电压=VCC就是高电平,输出电压=GND(一般是0V)就是低电平,分别用1和0来表示,这个是理想值。 但实际上它也有一个范围,比如你的单片机供电压(…

jmeter 固定吞吐量定时器

使用:模拟18000 QPS查询 Hits Per SecondTPS :聚合报告: Target throughput(in samples per minute):目标吞吐量(单位分钟),即每分钟执行多少次(TPM)Calculate Throughput based on(计算吞吐量策略):1、This thread only:仅对当前线程,也就是每个线程相互是不干扰的,都…

VS引用本地的NuGet包

Step1.打包 先选择项目/类库,进行打包。在输出中,找到打包的目录和文件。 Step2.本地创建一个文件夹用于放打包文件。Step3.添加包源 打开 VS --> 工具 --> NuGet包管理器 --> 管理解决方案的NuGet程序包 选择右上方:程序包源右侧的齿轮按钮 在程序包源中,新增一…

cuda、cudnn、zlib 深度学习GPU必配三件套(Ubuntu)

跨大版本不推荐,到处是坑、坑、坑~。tensorrt10、cuda12、cudnn9是目前最新的大版本,但是对于一般的老显卡(1050等),太新可能提醒一些错误(主要是tensorrt太新导致的)。为了不折腾,使用如下版本:tensorrt8.6.1、cuda11.8、cudnn8.9.7 默认已经安装了英伟达显卡的最新版…

微信公众号音频下载器

微信公众号音频下载器我关注的一个大V,总是喜欢发布音频内容。 但是呢,由于众所周知的原因,这些内容往往被删除了,我就没法再听了。。。 于是,我想给他的音频保存下来。 虽然我可以自己搞定,但是毕竟没有现成的工具。于是,我发挥程序员的优势,自己动手写一个小工具。于…