如何在Spring启动的时候执行一些操作

如何在Spring启动的时候执行一些操作

在Spring启动的时候执行一些操作有多种方式。你可以通过实现ApplicationRunner或者CommandLineRunner接口,在Spring Boot应用程序启动后执行特定操作。另外,你也可以使用@PostConstruct注解,在Spring Bean初始化后立即执行特定操作。此外,Spring Boot还提供了事件机制,你可以使用ApplicationListener接口或者@EventListener注解来监听应用程序的不同阶段,并在触发事件时执行相应的操作。

如果你需要处理复杂的命令行参数,建议使用ApplicationRunner;如果只需要简单地处理命令行参数,可以使用CommandLineRunner。通常情况下,根据实际需求选择合适的接口来实现即可。@PostConstruct注解适用于在Spring Bean初始化后立即执行一些必要的操作,例如初始化资源、建立连接、加载配置等。

使用 ApplicationRunner 或者 CommandLineRunner

实现 ApplicationRunnerCommandLineRunner 接口,这两个接口都定义了一个 run 方法,在 Spring Boot 应用程序启动后会执行该方法。

CommandLineRunner 示例:

@Component
public class MyRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {// 在这里执行一些操作}
}

ApplicationRunner 示例:

@Component
public class MyApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {List<String> nonOptionArgs = args.getNonOptionArgs();Set<String> optionNames = args.getOptionNames();// 处理命令行参数}
}

它们的区别在于,ApplicationRunner 接口的 run 方法接受一个 ApplicationArguments 参数,
该对象包含应用程序启动时传递的命令行参数。例如 getOptionNames()getOptionValues(String name) 等。适合处理复杂的命令行参数,例如选项和参数值的组合,以及非标准的参数格式。

CommandLineRunner 接口的 run 方法接受一个字符串数组参数。该数组包含应用程序启动时传递的命令行参数。适合处理简单的命令行参数,例如单个参数或标志。

如果你需要处理复杂的命令行参数,建议使用 ApplicationRunner;如果只需要简单地处理命令行参数,可以使用 CommandLineRunner。通常情况下,根据实际需求选择合适的接口来实现即可。

使用 @PostConstruct 注解

@PostConstruct 注解用于在 Spring Bean 初始化之后执行特定的操作。它通常用于执行一些需要在 Bean 初始化后立即执行的任务,例如初始化资源、建立连接、加载配置等。

@PostConstruct 注解的使用场景:

  1. 初始化资源@PostConstruct 注解可以用于标记一个方法,在 Spring 容器实例化 Bean 并设置好属性之后立即执行该方法。这样可以确保在使用 Bean 之前进行一些必要的初始化工作,例如初始化资源文件、预加载数据等。

    @Component
    public class MyBean {private Resource resource;@PostConstructpublic void init() {// 初始化资源resource = new Resource();}public Resource getResource() {return resource;}
    }
    
  2. 建立连接:在某些情况下,需要在 Bean 初始化后建立一些连接,例如数据库连接、消息队列连接等。可以使用 @PostConstruct 注解来执行这些连接操作,确保在 Bean 使用之前连接已经建立成功。

    @Component
    public class DatabaseConnector {private Connection connection;@PostConstructpublic void init() {// 建立数据库连接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");}public Connection getConnection() {return connection;}
    }
    
  3. 加载配置@PostConstruct 注解也可以用于加载一些配置信息,确保在使用 Bean 之前配置已经加载完毕。这样可以避免在使用 Bean 时还需要手动加载配置的问题。

    @Component
    public class AppConfig {private Properties properties;@PostConstructpublic void init() {// 加载配置文件properties = new Properties();try {properties.load(getClass().getClassLoader().getResourceAsStream("config.properties"));} catch (IOException e) {e.printStackTrace();}}public String getProperty(String key) {return properties.getProperty(key);}
    }
    

使用 Spring Boot 事件机制

Spring Boot 提供了事件机制,可以监听应用程序的不同阶段,并在触发事件时执行相应的操作。你可以实现 ApplicationListener 接口,然后监听 ApplicationStartedEvent 或其他事件。

@Component
public class MyApplicationListener implements ApplicationListener<ApplicationStartedEvent> {@Overridepublic void onApplicationEvent(ApplicationStartedEvent event) {// 在这里执行一些操作}
}

使用 @EventListener 注解

可以使用 @EventListener 注解在方法上监听 Spring 事件,并在事件发生时执行方法。需要注意的是,被注解的方法必须是公共方法。

@Component
public class MyEventListener {@EventListenerpublic void handleContextRefresh(ContextRefreshedEvent event) {// 在这里执行一些操作}
}

参考链接:

  • Spring Boot Docs - ApplicationRunner
  • Spring Boot Docs - CommandLineRunner
  • Spring Boot Docs - @PostConstruct
  • Spring Boot Docs - Events and Listeners

在这里插入图片描述

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

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

相关文章

【考研数学】张宇《1000题》强化阶段正确率多少算合格?

张宇1000题真的很练人心态.... 基础不好&#xff0c;建议别碰1000题 基础好&#xff0c;1000题建议在两个月以内刷完 如果自己本身在基础阶段学的比较水&#xff0c;自己的薄弱点刷了一小部分题没有针对性完全解决&#xff0c;转身去刷1000题就会发现&#xff0c;会的题目刷…

shell脚本-重定向与管道符

一、重定向 因为shell脚本有着批量操作的特殊性&#xff0c;大部分操作处于后台执行&#xff0c;不需要用户进行干预&#xff0c;所以提取、过滤并执行信息十分需要重定向和管道。重定向的意思是不输出到默认设备上&#xff0c;而是输出到你指定的位置&#xff08;文件、其他输…

1.微信小程序开发之准备工作

1.微信小程序账号注册 小程序开发 与 网页开发不一样&#xff0c;在开始微信小程序开发之前&#xff0c;需要访问 微信公众平台&#xff0c;注册一个微信小程序账号。 在拥有了小程序的账号以后&#xff0c;我们才可以开发和管理小程序&#xff0c;后续可以通过该账号进行开发…

国网电力分公司、税务企业如何向央媒投稿?

税务、电力、银行等单位如果想要将稿件发布到中央媒体&#xff0c;可以遵循为大家整理的以下步骤和建议&#xff1a; 了解央媒的定位与要求&#xff1a;中央媒体&#xff0c;如新华社、人民日报、中央电视台等&#xff0c;都有其独特的报道风格和关注重点。在投稿前&#xff0…

【Web后端】会话跟踪技术及过滤器

1.会话跟踪技术 1.1 会话的概念 在web应用中&#xff0c;浏览器和服务器在一段时间内发送请求和响应的连续交互的全过程 1.2 会话跟踪概念 对同一个用户跟服务器的连续请求和接收响应的监视过程 1.3 会话跟踪作用 浏览器和服务器是以http协议进行通信&#xff0c;http协议是…

算法工程师面试问题 | YOLOv8面试考点原理全解析(一)

本文给大家带来的百面算法工程师是深度学习目标检测YOLOv8面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习目标检测面试问题&#xff0c;并提供参考的回答…

AWS RDS ElasticCache 监控可观测最佳实践

在当今的电子商务时代&#xff0c;一个高效、稳定的电商平台对于保持竞争力至关重要。数据库作为电商平台的核心支撑&#xff0c;其性能直接影响到用户体验和业务流畅度。本文将深入探讨如何在电商场景下通过观测云对亚马逊云科技 RDS&#xff08;MySQL&#xff09; 和 Elastic…

python+selenium - UI自动框架之封装log类

通过自定log类&#xff0c;能把执行过程记录到日志&#xff0c;方便检查和重现问题。 log类介绍&#xff1a; 每次调用log函数&#xff0c;会根据绝对路径生成日志文件在logs目录下面(在被调用的时候日志会输出到指定的文件&#xff09;&#xff0c;日志文件的格式是年月日.lo…

vue+element的表格(el-table)排班情况表(2024-05-09)

vueelement的表格&#xff08;el-table&#xff09;排班情况&#xff0c;增删查改等简单功能 代码&#xff1a; <template><!-- 表格 --><div class"sedules"><el-header><el-date-pickerv-model"monthValue2"type"month…

postgresql中控制符带来的数据错觉

简介 在数据库字符集中&#xff0c;由于数据质量的控制不够完善&#xff0c;每一个字符集都并不是所有字符的能看见&#xff0c;有些字符的展示可能会出现乱码&#xff0c;甚至出现不同字符展示成同样效果的可能&#xff0c;给开发人员造成分析错觉。 当数据库存入了控制符&am…

【Unity Shader入门精要 第7章】基础纹理(三)

1. 渐变纹理 另外一种对于纹理的使用方式是通过渐变纹理为物体提供漫反射光照效果。 顾名思义&#xff0c;渐变纹理本身就是一张颜色渐变&#xff08;可以是连续渐变&#xff0c;也可能是突变&#xff09;的图片&#xff0c;这个渐变的过程模拟的就是光源从不同的角度照射物体…

Win11下Java环境安装指南

Windows下Java环境安装指南 前言一、安装简介JDK与JRE安装包 二、JDK安装检查操作系统类型基于Win11基于Win10 安装包准备工作 三、配置环境配置JAVA_HOME配置Path配置CLASSPATH 四、检验配置是否打开cmd命令行窗口输出java -version命令 五、注意事项 前言 在Windows系统上安…

移动机器人的机动性

移动机器人的机动性 机器人底盘运动学的活动性是表示它在环境中直接运动的能力。限制活动性的基本约束是每一轮子必须满足它的滑动约束的规则。所以,我们可从方程(3.26)正式地推导机器人的活动性。 除了瞬时的运动学运动之外,移动机器人通过操纵可操纵的轮子,能够随时操纵它的…

基于springboot实现的教师人事档案管理系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&…

循环神经网络RNN的初学

1.循环神经网络的特点 x1——>y1的同时会产生a1&#xff0c;它包含了我们第一列处理信息的一些特点&#xff0c;然后这个a1就会被传送到y2上去&#xff0c;那么x2——>y2的序列中就会包含前一个的特点&#xff0c;依次类推&#xff0c;这就是我们的RNN结构**&#xff08…

八分钟“手撕”包装类与泛型

目录 一、包装类 基本数据类型和对应的包装类 装箱和拆箱 【思考题】 二、泛型 什么是泛型 引出泛型 怎么定义泛型和使用泛型 裸类型(Raw Type) 擦除机制 额外&#xff0c;注意下列代码&#xff1a; 泛型的上界 泛型的接口应用 泛型方法 一、包装类 简单来…

HNCTF_RE复现(一)

baby_python hnctf.yuanshen.life:33276 网页打不开&#xff0c;只能 nc 连接远程服务器。 运行没有回显 利用pickletools库进行反编译为字节码&#xff08;不知道为什么&#xff09; # Python 3.10.12 from pickle import loads import pickletools main b"\x80\x04ct…

windows快速计算文件的SHA256数值的步骤

在文件路径打开cmd窗口 输入命令 用Windows自带的certutil命令来计算一个文件的校验值1&#xff1a; certutil支持的算法有&#xff1a;MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512。 certutil的使用方法非常简单&#xff0c;只需要执行“certutil -hashfile 文件名 校验值类型”…

分享我经常用的一个图片下载插件,不会写爬虫代码也能随意下载图片

更多精彩内容在公众号。 ImageAssistant&#xff08;图片助手&#xff09;是一款专为Chrome浏览器设计的扩展程序&#xff0c;它具备强大的网页图片处理功能。以下是关于ImageAssistant的一些主要特点和功能&#xff1a; 批量下载图片&#xff1a;ImageAssistant的核心功能之一…

HackTheBox-Machines--Bank

文章目录 0x01 信息收集0x02 文件上传漏洞利用0x03 权限提升方法一&#xff1a;SUID提权方法二&#xff1a;配置不当提权 Bank 测试过程 0x01 信息收集 1.端口扫描 发现 ssh(22)、DNS(53)、HTTP(80) 端口 nmap -sC -sV 10.129.29.200访问 80 端口&#xff0c;页面为Apache2 U…