详谈SpringBoot启动项目后执行自定义方法的方式
在 main 启动函数中调用
这个是在所有启动后执行,也是常用之一。
@SpringBootApplication
public class ListenerApplication {public static void main(String[] args) {SpringApplication.run(ListenerApplication.class, args);System.out.println("启动成功");}
}
实现 CommandLineRunner 接口
项目初始化完毕后才会调用方法,提供服务。好处是方法执行时,项目已经初始化完毕,是可以正常提供服务的。
@Component
public class CommandLineRunnerImpl implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println(Arrays.toString(args));}
}
实现 ApplicationRunner 接口
实现 ApplicationRunner 接口和实现 CommandLineRunner 接口基本是一样的。不同的是启动时传参的格式,CommandLineRunner 对于参数格式没有任何限制。
ApplicationRunner 接口参数格式必须是:key=value
@Component
public class ApplicationRunnerImpl implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {Set<String> optionNames = args.getOptionNames();for (String optionName : optionNames) {List<String> values = args.getOptionValues(optionName);System.out.println(values.toString());}}
}
注意
CommandLineRunner 和 ApplicationRunner 默认是 ApplicationRunner 先执行,如果双方指定了@Order 则按照 @Order 的大小顺序执行,大的先执行。
实现 ApplicationListener 接口
实现 ApplicationListener 接口和实现 ApplicationRunner、CommandLineRunner 接口基本差不多,项目初始化完毕后才会调用方法,提供服务。
@Component
public class ApplicationListenerImpl implements ApplicationListener<ApplicationStartedEvent> {@Overridepublic void onApplicationEvent(ApplicationStartedEvent event) {System.out.println("ApplicationStartedEvent");}}
当以 @Component 方式配置时,事件触发顺序如下:
ApplicationListener<ServletWebServerInitializedEvent>
ApplicationListener<ContextRefreshedEvent>
ApplicationListener<ApplicationStartedEvent>
ApplicationListener<ApplicationReadyEvent>
ApplicationListener<ContextClosedEvent>
当通过 /META-INF/spring.factories 配置时,事件触发顺序如下:
org.springframework.context.ApplicationListener=com.xh.event.ApplicationListenerImplApplicationListener<ApplicationStartingEvent>
ApplicationListener<ApplicationEnvironmentPreparedEvent>
ApplicationListener<ApplicationContextInitializedEvent>
ApplicationListener<ApplicationPreparedEvent>
ApplicationListener<ServletWebServerInitializedEvent>
ApplicationListener<ContextRefreshedEvent>
ApplicationListener<ApplicationStartedEvent>
ApplicationListener<ApplicationReadyEvent>
ApplicationListener<ContextClosedEvent>
注意
- 如果监听的是 ServletWebServerInitializedEvent、ContextRefreshedEvent、ApplicationStartedEvent 事件,则 ApplicationListener 会在 CommandLineRunner 和 ApplicationRunner 之前执行
- 如果监听的是 ApplicationReadyEvent 事件,则 ApplicationListener 会在 CommandLineRunner 和 ApplicationRunner 之后执行
- ContextClosedEvent 当调用关闭方法的时候,才会触发了 ContextClosedEvent 事件
实现 InitializingBean 接口
项目启动时,调用此方法,在 ServletWebServerInitializedEvent 事件前触发。
@Component
public class InitializingExample implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingExample");}
}
@PostConstruct 注解
使用注解 @PostConstruct 实现,不推荐使用。如果执行的方法耗时过长,会导致服务无法提供服务。
@Component
public class StartBoot {@PostConstructpublic void init() throws InterruptedException {System.out.println("@PostConstruct");}
}
相关文章:
详谈SpringBoot启动项目后执行自定义方法的方式
在 main 启动函数中调用 这个是在所有启动后执行,也是常用之一。 SpringBootApplication public class ListenerApplication {public static void main(String[] args) {SpringApplication.run(ListenerApplication.class, args);System.out.println("启动成…...
KubeAdmin方式搭建K8S(1.26.0)
本次安装K8S版本为1.26.0 服务器环境配置 ip描述配置192.168.233.221master节点CPU(2C) 内存(2G) 硬盘(50G)192.168.233.222node1节点CPU(2C) 内存(2G) 硬盘…...
代码随想录打卡—day57—【编辑距离】— 9.2+9.3 编辑距离系列
1 647. 回文子串 647. 回文子串 纯暴力解法,应该是O(n^3),居然AC了: class Solution { public:int countSubstrings(string s) {// 暴力int cnt 0;cout << s.substr(1,1);for(int i 0; i < s.size();i){…...

Blender界面学习03 原点、鼠标所在位置的缩放与旋转
物体的坐标原点可以移动 放大缩小时默认是屏幕中央,修改为鼠标在哪儿就缩放哪儿 默认旋转时围绕屏幕的中心 可以修改为指定对象旋转...

指针结构体题
目录 初阶指针_指针的概念 1.使用指针打印数组内容 2.字符串逆序 3.整形数组和字符串数组 4.打印菱形 5.打印水仙花数 6.计算求和 结构体 7.喝汽水问题 8.程序死循环解释 9.选择题总结tips 今天是重点是指针&结构体题题目。🆗🆗&#x…...
【力扣每日一题02】数组篇--删除有序数组中的重复项
一、题目 给你一个 升序排列 的数组 nums , 请你原地删除重复出现的元素,使每个元素 只出现一次 返回删除后数组的新长度。 元素的 相对顺序 应该保持 一致 。 然后返回 nums 中唯一元素的个数。 二、思路解析 这道题要用到 “双指针” 的概念&…...

Vue在表格中拿到该行信息的方式(作用域插槽-#default-scope-解决按钮与行点击的顺序问题)
遇到的问题 在做表格的时候,表格是封装好了的,用于展示数据。如果想给单行增加按钮,可以单独写一列存放按钮,最基本的需求是,点击按钮后要拿到数据然后发起请求。 且Vue的element-plus,当我们点击按钮之后…...
OJ练习第158题——单词拆分 II
单词拆分 II 力扣链接:140. 单词拆分 II 题目描述 给定一个字符串 s 和一个字符串字典 wordDict ,在字符串 s 中增加空格来构建一个句子,使得句子中所有的单词都在词典中。以任意顺序 返回所有这些可能的句子。 注意:词典中的…...

ArcGIS地块面积分割调整工具插件
地块分割调整工具可以实现将选定的图斑按照面积比例或者指定的面积,分割成多个图斑。 各个图斑的面积用逗号分隔,比例分割设置时,用整数表示。 面积分割时,最后一个图斑的面积可以不写,插件可以自动计算图斑的面积&a…...

基于Matlab实现多个图像增强案例(附上源码+数据集)
图像增强是数字图像处理中的一个重要步骤,它通过一系列的算法和技术,使图像在视觉上更加清晰、明亮、对比度更强等,以便更好地满足人们的需求。在本文中,我们将介绍如何使用Matlab实现图像增强。 文章目录 部分源码源码数据集下载…...

计算机网络 概述部分
目录 计算机网络在信息时代的作用 计算机网络的重要特征 网络,internet,Internet的区别 局域网 广域网的区别 网络协议的分层 计算机网络在信息时代的作用 计算机网络的重要特征 连通性:彼此联通,交换信息 共享性:信息共享…...

使用DOSBOX运行TurboC2,TC2使用graphics库绘图
Turbo C是由美国Borland公司开发的一套C语言程序开发工具,Borland公司是一家专门从事软件开发、研制的大公司。该公司相继推出了一套Turbo系列软件,如Turbo BASIC、Turbo Pascal、Turbo Prolog,这些软件很受用户欢迎 [1] 。 Turbo C集成了程序…...

OpenCV(二):认识Mat容器
目录 1.什么是Mat类 2.Mat类能存储的数据 整数类型(有符号和无符号): 浮点数类型: 布尔类型: 3.Mat类的创建 1.利用矩阵宽、高和类型参数创建Mat类 2.利用矩陈Size(结构和数据类型参数创建Mat类 3.利用已有Mat…...

springboot整合Excel填充数据
填充一组数据 准备模板 封装数据 import java.util.ArrayList; import java.util.List;/*** 使用实体类封装填充数据** 实体中成员变量名称需要和Excel表各种{}包裹的变量名匹配*/ Data public class FillData {private String name;private int age;// 生成多组数据代码pub…...
c语言技术面试记录 ---- 纲要、题目、分析及给分标准
纲要 作为一个面试官,除了编程类的问题,你还可以考虑问一些关于技术知识、项目经验、解决问题能力和团队合作等方面的问题,以全面评估应聘者的能力和适应性。以下是一个可能的提问逻辑和大纲,供你参考: 技术知识和基…...

前端进阶之——模块化
在做项目的时候越来越发现模块化的重要性,做好模块化开发不仅给后期的维护带来不少好处而且大大提升项目开发效率,接下来整理一下模块化相关知识吧。 模块化开发的优点 封装方法、提高代码的复用性、可维护性和可读性隔离作用域,避免污染全…...
Python爬虫抓取表情包制作个性化聊天机器人
在现代社交媒体和即时通讯应用中,使用表情包已经成为一种流行的沟通方。本文将介绍如何利用Python编写一个简单而有趣的聊天机器人,并通过爬虫技术来抓取各类表情包,使其具备个性化特点。 1.确定需求与功能 -定义聊天机器人需要实现哪…...

使用pip命令安装库,装到其他环境中的问题。
问题描述:我们在pycharm中创建了新的虚拟环境,但是在其终端使用Pip命令安装库时,发现库却安装到了其他conda创建的环境中。图示安装gym库,刚开始安装到了其他地方,第二次正确安装。 原因分析:安装库时&…...

如何使用CSS实现一个带有动画效果的进度条?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTML 结构:⭐ CSS 样式:⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那…...
uni-app 报错 navigateTo:fail page “/pages/.../...“ is not found
这个错误的意思是:识别不到该页面 错误可能一:没有在 pages.json【微信小程序是 app.json】中定义该页面的路径 如: pages.json "pages": [{"path": "pages/index/index" }, {"path": "pag…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...