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

Spring启动生命周期

Spring Boot 生命周期详解
Spring Boot 应用程序的生命周期包含几个阶段,每个阶段都有特定的事件和钩子,允许开发者在应用程序的不同生命周期阶段插入自定义逻辑。以下是 Spring Boot 生命周期的主要阶段和对应的事件:

  1. 准备阶段:
    1.1 ApplicationContextInitializer:

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {// 在应用上下文初始化之前执行的逻辑// 访问资源:可以访问 ConfigurableApplicationContext,但注意此时应用上下文中的 bean 尚未加载。// 推荐用途:适合做一些全局性的初始化工作,例如设置环境属性或配置文件的默认值。}
}

1.2 ApplicationEnvironmentPreparedEvent:


import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;public class MyApplicationEnvironmentPreparedListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {@Overridepublic void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {// 在应用环境准备完成之前执行的逻辑// 访问资源:通过事件对象可以访问到 ConfigurableEnvironment,在该阶段,应用上下文还未创建。// 推荐用途:在应用环境准备完成之前进行一些自定义配置,例如修改配置属性。}
}
  1. 启动阶段:
    2.1 ApplicationStartedEvent:

import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;public class MyApplicationStartedListener implements ApplicationListener<ApplicationStartedEvent> {@Overridepublic void onApplicationEvent(ApplicationStartedEvent event) {// 在 `SpringApplication` 开始运行时触发// 访问资源:无法直接访问太多资源,主要用于监听应用启动的事件。// 推荐用途:适合在应用程序启动后执行一些简单的逻辑,监听启动事件。// 具体场景:可以用于执行一些与应用程序整体启动相关的逻辑,例如记录应用程序启动时间等。}
}

2.2 ApplicationRunner:


import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;public class MyApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {// 在 Spring Boot 应用程序启动后执行逻辑// 访问资源:可以访问 `ApplicationArguments`,获取应用启动时的参数。// 推荐用途:适合在应用程序启动后执行一些高级的逻辑,处理应用启动参数。// 具体场景:可用于处理命令行参数,执行与应用启动有关的高级逻辑,例如数据初始化等。}
}
  1. 初始化阶段:
    3.1 ApplicationContextRefreshedEvent:

import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.ApplicationListener;public class MyContextRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {// 在容器刷新完成后执行自定义逻辑// 访问资源:可以访问到 `ConfigurableApplicationContext`,表示应用上下文已刷新。// 推荐用途:适合在容器刷新完成后执行一些初始化操作,处理一些全局性的逻辑。// 具体场景:可以用于执行一些在整个应用上下文刷新完成后需要进行的初始化操作,例如加载缓存等。}
}

3.2 InitializingBean:


import org.springframework.beans.factory.InitializingBean;public class MyBean implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {// 初始化逻辑// 访问资源:可以在 `afterPropertiesSet` 方法中访问到 `BeanFactory`,但依赖于 bean 的属性注入。// 推荐用途:适合在 bean 初始化阶段执行一些初始化逻辑,处理 bean 特定的初始化操作。// 具体场景:用于在 bean 的属性注入完成后执行一些与该 bean 初始化相关的操作,例如数据库连接的初始化等。}
}

3.3 @PostConstruct:


import javax.annotation.PostConstruct;public class MyBeanWithPostConstruct {@PostConstructpublic void postConstruct() {// 在对象创建并且所有依赖注入完成后执行的逻辑// 访问资源:可以在标注有 `@PostConstruct` 的方法中访问 bean 的所有资源,但依赖于 bean 的属性注入。// 推荐用途:适合在 bean 初始化阶段执行一些初始化逻辑,处理 bean 特定的初始化操作。// 具体场景:可用于执行一些在 bean 初始化时需要进行的操作,例如初始化配置等。}
}
  1. 销毁阶段:
    4.1 DisposableBean:
import org.springframework.beans.factory.DisposableBean;public class MyDisposableBean implements DisposableBean {@Overridepublic void destroy() throws Exception {// 在容器销毁时执行的逻辑// 访问资源:可以在 `destroy` 方法中访问到 `BeanFactory`,但依赖于 bean 的属性注入。// 推荐用途:适合在容器销毁时执行一些清理逻辑,处理 bean 特定的销毁操作。// 具体场景:用于在 bean 被销毁时执行一些与该 bean 相关的清理操作,例如关闭数据库连接等。}
}

4.2 @PreDestroy:


import javax.annotation.PreDestroy;public class MyBeanWithPreDestroy {@PreDestroypublic void preDestroy() {// 在对象销毁前执行的逻辑// 访问资源:可以在标注有 `@PreDestroy` 的方法中访问 bean 的所有资源,但依赖于 bean 的属性注入。// 推荐用途:适合在 bean 销毁前执行一些清理逻辑,处理 bean 特定的销毁操作。// 具体场景:可用于执行一些在 bean 销毁前需要进行的清理操作,例如释放资源等。}
}

4.3 DestructionAwareBeanPostProcessor:


import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor;public class MyDestructionAwareBeanPostProcessor implements DestructionAwareBeanPostProcessor {@Overridepublic void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {// 在 bean 销毁前执行的逻辑// 访问资源:可以在 `postProcessBeforeDestruction` 方法中访问到 bean 对象和 bean 的名称。// 推荐用途:适合在 bean 销毁前执行一些自定义的清理逻辑,处理 bean 特定的销毁操作。// 具体场景:用于在 bean 销毁前执行一些与该 bean 相关的自定义清理操作,例如发送通知等。}
}
  1. 其他:
    5.1 ApplicationFailedEvent:

import org.springframework.boot.context.event.ApplicationFailedEvent;
import org.springframework.context.ApplicationListener;public class MyApplicationFailedListener implements ApplicationListener<ApplicationFailedEvent> {@Overridepublic void onApplicationEvent(ApplicationFailedEvent event) {// 在启动时发生异常时执行的逻辑// 访问资源:可以访问到异常信息,但不能保证所有的资源都已经初始化完成。// 推荐用途:适合在应用程序启动失败时执行一些额外的逻辑,例如记录错误信息或发送通知。}
}

5.2 ApplicationReadyEvent:


import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;public class MyApplicationReadyListener implements ApplicationListener<ApplicationReadyEvent> {@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {// 在应用程序准备就绪时执行的逻辑// 访问资源:可以访问到应用上下文已经准备就绪的状态。// 推荐用途:适合执行在应用程序准备就绪后需要进行的逻辑,例如启动定时任务等。}
}

相关文章:

Spring启动生命周期

Spring Boot 生命周期详解 Spring Boot 应用程序的生命周期包含几个阶段&#xff0c;每个阶段都有特定的事件和钩子&#xff0c;允许开发者在应用程序的不同生命周期阶段插入自定义逻辑。以下是 Spring Boot 生命周期的主要阶段和对应的事件&#xff1a; 准备阶段&#xff1a;…...

瑞芯微RK3568芯片介绍

RK3568简介 RK3568是一款由瑞芯微电子有限公司&#xff08;Rockchip Electronics Co. Ltd&#xff09;推出的高性能多媒体处理器&#xff0c;定位于中高端市场&#xff0c;被广泛应用于平板电脑、多媒体盒子、电子看板和工业控制等领域。以下是对这款芯片的简要介绍&#xff1…...

15.一种坍缩式的简单——组合模式详解

当曾经的孩子们慢慢步入社会才知道&#xff0c;那年味渐淡的春节就像是疾驰在人生路上的暂停键。 它允许你在隆隆的鞭炮声中静下心来&#xff0c;瞻前顾后&#xff0c;怅然若失。 也允许你在寂静的街道上屏气凝神&#xff0c;倾听自己胸腔里的那团人声鼎沸。 孩子们会明白的&am…...

Node.js的debug模块源码分析及在harmonyOS平台移植

Debug库 是一个小巧但功能强大的 JavaScript 调试工具库&#xff0c;可以帮助开发人员更轻松地进行调试&#xff0c;以便更快地发现和修复问题。它的主要特点是可以轻松地添加调试日志语句&#xff0c;同时在不需要调试时可以轻松地禁用它们&#xff0c;以避免在生产环境中对性…...

【Crypto | CTF】BUUCTF RSA2

天命&#xff1a;密码学越来越难了&#xff0c;看别人笔记都不知道写啥 天命&#xff1a;莫慌&#xff0c;虽然我不会推演法&#xff0c;但我可以用归纳法 虽然我不知道解题的推演&#xff0c;但我可以背公式啊哈哈哈 虽然我不会这题&#xff0c;但是我也能做出来 公式我不知…...

单片机学习笔记---红外遥控红外遥控电机调速(完结篇)

目录 低电平触发中断和下降沿触发中断的区别 红外遥控 Int0.c Int.h Timer0.c Timer0.h IR.c IR.h main.c 红外遥控电机调速 Timer1.c Timer.h Motor.c Motor.h main.c 上一节讲了红外发送和接收的工作原理&#xff0c;这一节开始代码演示&#xff01; 提前说…...

Linux第62步_备份移植好的所有的文件和文件夹

1、备份“my-tfa”目录下所有的文件和文件夹 1)、打开终端 输入“ls回车”&#xff0c;列出当前目录下所有的文件和文件夹 输入“cd linux回车”&#xff0c;切换“linux”目录下 输入“ls回车”&#xff0c;列出当前目录下所有的文件和文件夹 输入“cd atk-mp1/回车”&am…...

【xss跨站漏洞】xss漏洞前置知识点整理

xss漏洞成因 xss漏洞是一种前端javascript产生的漏洞。 我们网站基本都是会用到javascript编写一些东西&#xff0c;浏览器也能直接识别javascript。 如果有一个地方能够输入文字&#xff0c;但是他又没有过滤你的输入&#xff0c;那么自己或者他人看到你输入的javascript代…...

mac下mysql 常用命令

mysql启动命令 在Mac OS X启动和停止MySQL服务的命令&#xff0c; 启动MySQL服务 sudo /usr/local/mysql/support-files/mysql.server start 停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop 重启MySQL服务 sudo /usr/local/mysql/support-files/mys…...

2.21号qt

1.QMainWindow中常用的类 继承于QMainWindow类&#xff0c;原因该类提供了QWidget没有提供的成员函数。 菜单栏、工具栏、状态栏、浮动窗口&#xff08;铆接部件&#xff09;、核心部件 1.1 菜单栏 QMenuBar //创建菜单栏 QMenuBar 最多只能有一个 QMenuBar *mbar menu…...

什么是MVVM?MVC、MVP与MVVM模式的区别?

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种软件架构模式&#xff0c;用于将用户界面&#xff08;View&#xff09;与业务逻辑&#xff08;Model&#xff09;分离&#xff0c;并通过ViewModel来连接两者。MVVM的目标是实现可测试性、可维护性和可复用性。 MVC&am…...

ElementUI组件的安装和使用

Element UI 是一款基于 Vue 2.0 的桌面端组件库&#xff0c;主要用于快速构建网站的前端部分。它提供了丰富的组件&#xff0c;如按钮、输入框、表格、标签页等&#xff0c;以及一些布局元素&#xff0c;如布局容器、分割线等。Element UI 的设计风格简洁&#xff0c;易于上手&…...

Laravel01 课程介绍以及Laravel环境搭建

Laravel01 课程介绍 1. Laravel2. mac开发环境搭建(通过Homebrew)3. 创建一个项目 1. Laravel 公司中面临着PHP项目与Java项目并行&#xff0c;所以需要我写PHP的项目&#xff0c;公司用的框架就是Laravel&#xff0c;所以在B站上找了一门课学习。 Laravel中文文档地址 https…...

面试redis篇-03缓存击穿

原理 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮 解决方案一:互斥锁 解决方案二:逻辑过期 提问与回答 面试官 :什么是缓存击穿 ? 怎么解决 ? 回答: 缓存击穿的意思…...

k8s容器以及基础设施优化

1.硬件系统选型&#xff1a;宿主机通用配置16c/32GB/4网卡队列 2.os优化&#xff1a;单机支持百万tcp并发&#xff0c;/etc/sysctl.conf,/etc/security/limits.conf 3.k8s&容器层优化&#xff1a;性能优化initContainer 4.kube-dns优化&#xff1a;增大--cache-size,设置…...

蓝桥杯备赛系列——倒计时50天!

蓝桥杯备赛系列 倒计时50天&#xff01; 前缀和和差分 知识点 **前缀和数组&#xff1a;**假设原数组用a[i]表示&#xff0c;前缀和数组用sum[i]表示&#xff0c;那么sum[i]表示的是原数组前i项之和&#xff0c;注意一般用前缀和数组时&#xff0c;原数组a[i]的有效下标是从…...

jenkins配置ssh的时候测试连接出现Algorithm negotiation fail

背景&#xff1a;当jenkins升级后&#xff0c;同时ssh插件也升级&#xff0c;测试ssh连接的时候 出现的问题&#xff1a; com.jcraft.jsch.JSchAlgoNegoFailException: Algorithm negotiation fail: algorithmName"server_host_key" jschProposal"ecdsa-sha2-n…...

思维模型整合

思维模型整合 4P--- 4C思考模型能力圈模型 4P— 4C思考模型 在竞争激烈的今天&#xff0c;每个赛道都有众多可以为客户提供相同价值的对手&#xff0c;而赛道中的佼佼者之所以能打败大部分人&#xff0c;可能并不是他们能比别人更能讨好大众&#xff0c;而是因为在这个赛道它有…...

代理模式笔记

代理模式 代理模式代理模式的应用场景先理解什么是代理&#xff0c;再理解动静态举例举例所用代码 动静态的区别静态代理动态代理 动态代理的优点代理模式与装饰者模式的区别 代理模式 代理模式在设计模式中是7种结构型模式中的一种&#xff0c;而代理模式有分动态代理&#x…...

手机中有哪些逆向进化的功能

手机中有哪些逆向进化的功能&#xff1f;逆向进化是指明明很优秀的很方便的功能&#xff0c;却因为成本或者其他工业原因莫名其妙地给取消了。 逆向进化1&#xff1a;可拆卸电池-变为不可拆卸电池。 智能手机为了追求轻薄等原因&#xff0c;所以移除了可拆卸电池功能。将电池…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...

深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”

深入浅出JavaScript中的ArrayBuffer&#xff1a;二进制数据的“瑞士军刀” 在JavaScript中&#xff0c;我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时&#xff0c;单纯依赖字符串或数组就显得力不从心了。这时&#xff…...

智能体革命:企业如何构建自主决策的AI代理?

OpenAI智能代理构建实用指南详解 随着大型语言模型&#xff08;LLM&#xff09;在推理、多模态理解和工具调用能力上的进步&#xff0c;智能代理&#xff08;Agents&#xff09;成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同&#xff0c;智能代理能够自主执行工…...

记一次spark在docker本地启动报错

1&#xff0c;背景 在docker中部署spark服务和调用spark服务的微服务&#xff0c;微服务之间通过fegin调用 2&#xff0c;问题&#xff0c;docker容器中服务器来后&#xff0c;注册中心都有&#xff0c;调用服务也正常&#xff0c;但是调用spark启动任务后报错&#xff0c;报错…...