详谈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…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
