SpringBoot初始化接口CommandLineRunner

news2024/11/25 10:50:29

CommandLineRunner的使用

  • 接口定义
    • 使用
    • 执行顺序
      • 使用 @Order 注解
      • 实现Orderd接口
      • 排序总结

接口定义

Spring官方给出的接口定义

package org.springframework.boot;

@FunctionalInterface
public interface CommandLineRunner {
    void run(String... args) throws Exception;
}

在 Spring Boot 应用程序中,CommandLineRunner 是一个接口,用于定义在应用程序启动后执行的任务。它有一个单独的方法 run(),在应用程序启动完成后自动调用。

具体来说,CommandLineRunner 的 run() 方法会在 Spring Boot 应用程序完成启动过程后立即执行。这意味着在 Spring 上下文加载完毕、所有 Bean 实例化完成之后,run() 方法将被调用。
可以看到,该接口还是一个函数式接口,函数式的方式就不演示了,我们这里继承该接口实现方法即可

使用

在我们需要进行初始化的类中直接实现该接口的 run()方法即可
注意:如果你要run方法能被执行,你必须将实现了该接口的类注入到Spring容器中

CommandLineRunner 接口通常用于在应用程序启动后执行一些初始化任务或准备工作,例如加载初始数据、设置定时任务、启动后台线程等。通过实现 CommandLineRunner 接口并覆盖 run() 方法,你可以将你的任务逻辑放在其中,以便在应用程序启动时自动执行。


@Component
public class MyComponent implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("MyComponent -> CommandLineRunner");
    }
}

执行结果
在这里插入图片描述

可以看到该方法在Application started之后才执行

执行顺序

需要注意的是,如果应用程序中有多个实现了 CommandLineRunner 的类,它们的执行顺序可能是不确定的。如果你需要确保执行顺序,可以使用 @Order 注解或实现 org.springframework.core.Ordered 接口来指定顺序。
在 Spring Framework 中,@Order 注解用于指定组件的执行顺序。它可以应用于类级别或方法级别。

使用 @Order 注解

示例代码如下所示:
定义两个类,order分别为1和2

@Component
public class MyComponent1  implements CommandLineRunner {

    Logger logger = LoggerFactory.getLogger(MyComponent1.class);

    @Order(1)
    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent1 -> CommandLineRunner");
    }
}
@Component
public class MyComponent2 implements CommandLineRunner {

    Logger logger = LoggerFactory.getLogger(MyComponent2.class);

    @Order(2)
    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent2 -> CommandLineRunner");
    }
}

运行结果:
在这里插入图片描述

对于类级别的 @Order 注解,它指定了组件在 Spring 上下文中的加载顺序。具体来说,数值越小的组件将先被加载和初始化。如果没有显式指定 @Order 注解,默认情况下,组件的加载顺序是不确定的。

实现Orderd接口

实现org.springframework.core.Ordered 中的getOrder()方法

下面再创建两个类,并实现 org.springframework.core.Ordered 接口。

@Component
public class MyComponent3 implements Ordered, CommandLineRunner {
    Logger logger = LoggerFactory.getLogger(MyComponent3.class);

    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent3 -> CommandLineRunner");
    }

    @Override
    public int getOrder() {
        return 3;
    }
}
@Component
public class MyComponent4 implements Ordered, CommandLineRunner {
    Logger logger = LoggerFactory.getLogger(MyComponent4.class);

    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent4 -> CommandLineRunner");
    }

    @Override
    public int getOrder() {
        return 4;
    }
}

执行结果如下:
在这里插入图片描述

可以看到无论使用哪种方式都是order值更小的优先执行,但是实现org.springframework.core.Ordered接口的会比在方法上使用@Order注解的有更高的优先级,所有实现org.springframework.core.Ordered接口的类中的run方法会都会优先于在方法上使用@Order注解执行,无论设置的值是否比注解中的更小

我这里猜测可能是实现接口是类级别的order,所以会优先于方法级别的order,所以我又做了下面实验,将MyComponent1和MyComponent2中的@Order注解挪到类声明上,所以就变成了下面这样

@Order(1)
@Component
public class MyComponent1  implements CommandLineRunner {

    Logger logger = LoggerFactory.getLogger(MyComponent1.class);


    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent1 -> CommandLineRunner");
    }
}
@Order(2)
@Component
public class MyComponent2 implements CommandLineRunner {

    Logger logger = LoggerFactory.getLogger(MyComponent2.class);


    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent2 -> CommandLineRunner");
    }
}

再次执行结果:
在这里插入图片描述
果然MyComponent1和MyComponent2排到前面去了,看来猜测没有错

排序总结

  • @Order注解在类上会比注解在方法上拥有更高的优先级
  • 实现org.springframework.core.Ordered接口的getOrder()方法和@Order注解在类上是相同的优先级
  • order值越小越先执行
  • order值可以为负数,一样遵循越小越优先的规则

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

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

相关文章

卡方检验之多重比较

一、案例介绍 某医师研究物理疗法、药物治疗和外用膏药3种疗法治疗周围性面神经麻痹的疗效,通过整体卡方检验已经得知3种疗法有效率的差异有统计学意义(χ221.0377,p0.000)的结论。现在想进一步知道,具体是哪两种疗法…

Android后台应用开启前台服务---android8到android12梳理

1、Android 8.0 异常报错 在Android 8.0 系统中,处于后台的应用想要开启前台服务,必须满足两点: 在Activity中调用startForegroundService()方法所调起的Service必须执行startForeground(int id, Notification notification)方法&#xff0…

计算几何——gitf-wrapping算法

几何中的"gift-wrapping"算法,又称为"Jarvis算法",是一种用于计算凸包(convex hull)的方法。下面我将为你解释一下该算法的步骤: 1. 找到具有最小x坐标的点P,我们将其作为凸包的起点。 2. 将P标记为当前点&a…

doker安装RabbitMQ以及用java连接

目录 doker安装: RabitMq安装: java链接 doker安装: 参考链接(非常详细): docker安装以及部署_docker bu shuminio_春风与麋鹿的博客-CSDN博客 安装好后开启doker //启动docker服务 systemctl start do…

PromQL讲解与实战操作

PromQL讲解与实战操作 一、PromQL 介绍 PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言,它能实现对事件序列数据的查 询、聚合、逻辑运算等。它并且被广泛应用在 Prometheus 的日常应用当中,包括对数据查询…

在Linux服务器上简单部署一个Python项目

一、在对应的服务器上检查有无Python环境 大部分Linux系统都是自带了Python环境的,查看是否具备Python的运行环境,可以通过命令Python --version 或者 Python3 --version 查看。如果你的项目需要Python3的环境,而系统又没有,则需要…

Linux 开启 swap 分区详细教程

故事背景: 哥们云机器内存资源不足,搞个 kafka eagle 监控,刚跑起来就卡死了,就很无语,哥们忙活,算了直接开搞,内存不够,硬盘来凑,拿着硬盘去做swap分区,也能…

JavaEE-SpringMVC-云借阅图书管理系统(包含源码、数据库sql文件、报告)

文章目录 前言云借阅系统功能结构图云借阅系统结构层次云借阅系统项目文件组织结构开发环境具体操作1. Maven仓库修改2. MySQL数据库配置文件3. Tomcat运行截图 总结 前言 参考借鉴黑马程序员书籍;和老师上课讲解的代码和PPT。核心代码由自己编写完成,核…

【夜深人静学数据结构与算法】回溯算法

目录 前言: 回溯算法: 回溯法的常见应用: 回溯法的模板: 回溯法的图解:​ 案例: 77. 组合 - 力扣(LeetCode) 总结: 前言: 回溯算法是一个比较抽象的算法,因此我们…

JavaScript中的面向对象

面向对象编程是一种编程范式。 面向对象。何为对象? 复习一下: JavaScript中的数据类型分为: 原始类型:数值型,字符串型,布尔型、ES6新增的symbol 特殊类型:undefined型,null型 组合…

chatgpt赋能python:隐藏输入:保护密码和敏感数据的有效方法

隐藏输入:保护密码和敏感数据的有效方法 在今天的数字时代,网络安全成为了无所不在的话题。密码和敏感数据的泄漏是任何人都不想看到的结果。因此,在这种情况下,隐藏输入成为了保护我们的密码和敏感数据的有效方法。 Python是数…

el-date-picker设置右侧显示图标

<template><div><el-form ref"form" label-width"100px"><el-form-item label"日期&#xff1a;" class"date_box"><el-date-picker v-model"time" type"date" :clearable"true&…

【GaussDB分布式特性】

GaussDB分布式特性 实验环境一、分布式架构二、分片和分区 实验环境 华为云GaussDB云数据库&#xff0c;规则如下&#xff1a; 集群拓扑结构&#xff0c;如下&#xff1a; 一、分布式架构 逻辑架构 常用部署方式 部署说明&#xff1a; 1.双AZ采用带第三方仲裁方式部署&am…

利用低代码平台实现协同办公,助力企业提升效益

概要&#xff1a;本文介绍了协同办公的作用&#xff0c;以及利用低代码平台实现协同办公的优势。同时也分享了天翎为华晨汽车打造的低代码协同工具&#xff0c;帮助企业提高管理效率&#xff0c;改善运营模式&#xff0c;提升产品质量及生产精益化。展示了咨询库、原料质量录入…

无锁队列ringbuff实现以及性能

文章目录 一、使用场景二、对比有锁优势三、无锁队列实现方式四、循环队列实现1&#xff09;数据结构设计3&#xff09;代码实现4&#xff09;性能测试5&#xff09;总结 一、使用场景 无锁队列主要适用于高并发场景或者对性能要求较高的场景&#xff0c;主要使用场景有如下几…

pytorch的permute(dims) 函数的功能详解

有三块 二维矩阵 如下 把二维矩阵堆叠起来&#xff0c;就是三维 矩阵 这样的矩阵 从x方向看&#xff08;0维&#xff09; 有三块 记为3&#xff0c;每块从y方向看&#xff08;1维&#xff09;的行是3&#xff0c;从z方向看&#xff08;2维&#xff09;列也是3&#xff0c;故三…

计算机中丢失mfc140.dll怎么解决?mfc140.dll是什么文件?

在计算机运行软件或者游戏的时候&#xff0c;提示mfc140.dll丢失&#xff0c;无法正常启动运行。 mfc140.dll是Windows操作系统中用于支持C编程语言的一个动态链接库&#xff0c;它包含了C运行时库的一些基本功能。用于支持Microsoft Visual Studio的MFC&#xff08;Microsoft …

论文解读:FastSAM | Fast Segment Anything | 基于yolov8-seg实现 比SAM快50倍

发表时间&#xff1a;2023.06.21 论文地址&#xff1a;http://export.arxiv.org/pdf/2306.12156 项目地址&#xff1a;https://github.com/CASIA-IVA-Lab/FastSAM 最近提出的任意分割模型&#xff08;SAM&#xff09;在许多计算机视觉任务中产生了重大影响。它正在成为许多高级…

NIO总结

简要介绍 NIO&#xff08;Non-blocking IO&#xff09;是Java 1.4版本开始引入的一个新的IO API&#xff0c;旨在代替传统IO&#xff0c;它引入了缓冲区和通道的概念&#xff0c;通过选择器实现多路复用。 传统IO会区分字节流InputStream和OutputStream以及字符流Reader和Wri…

GD32 时钟和晶振修改

芯片型号&#xff1a;gd32f470zi 库版本&#xff1a;GD32F4xx_Firmware_Library_V3.0.4 当需要修改外部晶振和主频时需要修改到以下几个地方 1.gd32f4xx.h //此宏定义为我们实际使用的外部晶振频率&#xff0c;此处改为实际使用的25M #define HXTAL_VALUE ((uint32_t)2…