如何在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 {
    @Override
    public void run(String... args) throws Exception {
        // 在这里执行一些操作
    }
}

ApplicationRunner 示例:

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

    @Component
    public class DatabaseConnector {
        private Connection connection;
    
        @PostConstruct
        public 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;
    
        @PostConstruct
        public 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> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        // 在这里执行一些操作
    }
}

使用 @EventListener 注解

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

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

参考链接:

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

圆片/圆盘测厚设备 HW01-SG系列单点测厚仪

关键字:圆片测厚仪圆盘测厚仪, 圆形测厚仪, 单点测厚仪, 汽车工件测厚仪, 产品简介&#xff1a; 测厚仪采用上下两个对射的激光位移传感器测量圆盘状物体边缘的厚度。圆盘放置在由步进电机驱动的托盘上&#xff0c;点按测量按钮托盘旋转一周&#xff0c;可测量被测物整个圆周上…

立即注册 | 线上讲座:基于 NGINX 为现代应用构筑三大安全防线

原文作者&#xff1a;NGINX 原文链接&#xff1a;立即注册 | 线上讲座&#xff1a;基于 NGINX 为现代应用构筑三大安全防线 转载来源&#xff1a;NGINX 开源社区 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 基本信息 课程主题&#xff1a;基于 NGINX 为现代应用构…

大模型算法(零) - Transformer中的细节与实现

讲transformer的文章已经铺天盖地了&#xff0c;但是大部分都是从原理的角度出发的文章&#xff0c;原理与实现之间的这部分讲解的较少&#xff0c;想要了解实现细节&#xff0c;还是要去看代码才行。记录一下自己学习过程中遇见的细节问题和实现问题。 Transformer整体架构 图…

Android面试题之Kotlin的几种常见的类

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 初始化的顺序 主构造函数里声明的属性 类级别的属性赋值 init初始化块里的属性赋值和函数调用 次构造函数里的属性赋值和函数调用 延迟初始…

Chirpstack配合网关与lora设备通信

之前的章节讲过chirpstack的下载和安装部署&#xff0c;这节算是后续&#xff0c;利用chirpstack和lora设备做通信&#xff0c; 首先开启chirpstack&#xff0c;并登录&#xff0c;登录完成之后需要添加网关和设备&#xff0c;添加网关也就是Gatway&#xff0c;所以点开左侧的G…

搜索二维矩阵 - LeetCode 热题 64

大家好&#xff01;我是曾续缘&#x1f9e1; 今天是《LeetCode 热题 100》系列 发车第 64 天 二分查找第 2 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增…

激光切割机哪家可靠?

激光切割机哪家可靠&#xff1f;市面上的激光切割机牌子很多&#xff0c;具体什么牌子好&#xff0c;建议综合考虑一下企业成立时间、技术实力、设备工艺做工、售后服务&#xff0c;一般成立时间长&#xff0c;设备装配经验丰富&#xff0c;售后服务完善的企业&#xff0c;能够…

深度学习之卷积神经网络理论基础

深度学习之卷积神经网络理论基础 卷积层的操作&#xff08;Convolutional layer&#xff09; 在提出卷积层的概念之前首先引入图像识别的特点 图像识别的特点 特征具有局部性&#xff1a;老虎重要特征“王字”仅出现在头部区域特征可能出现在任何位置下采样图像&#xff0c…

银行业数据分析专家视角:业务场景中的深度解析与应用

一、引言 在数字化和大数据时代的浪潮下&#xff0c;银行业正经历着前所未有的变革。作为数据分析领域的资深专家&#xff0c;我深知数据分析在银行业务发展中的重要性和价值。本文将从银行业数据分析的角度出发&#xff0c;深入探讨相关业务场景下的数据分析应用&#xff0c;…

Linux 操作系统MySQL 数据库指令

1.MySQL 数据库 数据库是“按照数据结构来组织、 存储和管理数据的仓库”。 是一个长期存储在计算机内的、 有组织的、 可共享的、 统一管理的大量数据的集合。 它的存储空间很大&#xff0c; 可以存放百万条、 千万条、 上亿条数据。 但是数据库并不是随意地将数据进行…

[vue] nvm use时报错 exit status 1:一堆乱码,exit status 5

报错exit status 5&#xff1a;&#xfffd;ܾ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ʡ&#xfffd; 原因&#xff1a;因为当前命令提示符窗口是user权限&#xff0c; 解决&#xff1a;cmd使用管理员方式打开就可以 参考&#xff1a; vm use时报错 exit status 1…

24长三角A题思路+分析选题

需要资料的宝子们可以进企鹅获取 A题 问题1&#xff1a;西湖游船上掉落华为 mate 60 pro 手机 1. 手机掉落范围分析 物品特征&#xff1a;华为 mate 60 pro 手机的尺寸、重量、形状等特性。静水假设&#xff1a;西湖水面平静&#xff0c;不考虑水流影响。掉落位置&#xff…

Linux基础之进程的优先级

目录 一、进程优先级的概念 二、进程优先级的查看 三、怎么修改进程优先级 四、进程饥饿 一、进程优先级的概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linu…

从零入门激光SLAM(十七)——SLAM中为什么用ESKF误差卡尔曼滤波器

上一节&#xff0c;介绍了卡尔曼滤波的基本原理&#xff0c;但在SLAM中却使用ESKF&#xff0c;让我们一起看看具体的原因是什么吧 一、误差卡尔曼滤波器ESKF(Error State Kalman Filter) 1.1动机 在常规的卡尔曼滤波器中&#xff0c;需要假定系统的状态服从高斯分布&#xf…

语法分析-文法

如果对于一部文法中&#xff0c;存在至少一个句子有两个或者两个以上的语法树则该文法是二义性的。 我们可以以上面的例子进行解释&#xff0c;对于第棵个语法树&#xff0c;我们可以看到是先进行了加法运算再进行的乘法运算&#xff0c;因为需要先把EE作为整体运算完后再成为E…

github新手用法

目录 1&#xff0c;github账号注册2&#xff0c;github登录3&#xff0c;新建一个仓库4&#xff0c;往仓库里面写入东西或者上传东西5&#xff0c; 下载Git软件并安装6 &#xff0c;获取ssh密钥7&#xff0c; 绑定ssh密钥8&#xff0c; 测试本地和github是否联通9&#xff0c;从…

研发数据在企业内部多重传输场景,怎样才能有效响应?

研发数据因行业不同包含的种类各异&#xff0c;主要有设计和仿真数据、研发投入、进展和成果数据、生产过程数据、维护和保养数据、质量数据等&#xff0c;企业研发数据对企业而言具有至关重要的意义。特别是以研发为核心业务及定位的企业&#xff0c; 如半导体 IC 设计、生物制…

淘宝购物必备神器,淘宝商品评论电商API接口告诉你真实惠品质好!

众所周知&#xff0c;淘宝作为国内最大的电商平台&#xff0c;拥有数以亿计的商品以及海量的评论。然而&#xff0c;由于淘宝上的商品数量庞大&#xff0c;品质参差不齐&#xff0c;买家往往难以决策。此外&#xff0c;有些商品的评论可信度也受到一定的质疑&#xff0c;很难了…

SSM框架打造的高效稳定网上购物商城管理系统

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

冯喜运:5.16黄金多头或挑战2400关口,原油最新行情分析

【黄金消息面分析】&#xff1a;在最新数据显示通胀回落和零售销售疲软后&#xff0c;交易员评估美联储转向货币宽松的时机和幅度&#xff0c;黄金市场出现了一些新的动力。根据周三&#xff08;5月15日&#xff09;公布的数据&#xff0c;衡量美国潜在通胀的指标4月份出现六个…