15、两个Runner初始化器(ApplicationRunner接口和CommandLineRunner接口的实现类)

news2024/11/24 13:05:31

两个Runner初始化器

两个Runner初始化器——主要作用是对component组件来执行初始化
这里的Component组件我理解为是被@Component注解修饰的类
@Component //用这个注解修饰的类,意味着这个类是spring容器中的一个组件,springboot应用会自动加载该组件。

两个Runner初始化器,实际上就是两个接口,ApplicationRunner接口和CommandLineRunner接口。这两个接口功能大致相同,实现的方法都是run()方法。
作用:
在springApplication的run()方法完成之前,这两个接口的实现类里面的run()方法会被自动调用,因此,这两个实现类非常适合在springboot项目启动之后、对外提供服务之前执行一些特定的初始化处理。
和容器初始化器的功能有些相似。不是针对容器进行初始化,而是针对应用来进行初始化。所以也叫他们两个为初始化器。

在SpringApplication的run()完成之前,Spring Boot会自动调用实现了ApplicationRunner或CommandLineRunner接口的类里面的run()方法。
换句话来说,如果一个被 @Component注解 修饰的类实现了ApplicationRunner或CommandLineRunner接口,Spring boot将会在SpringApplication的run()完成之前,自动调用该实现类里面的重写的run()方法

相当于一个钩子方法,专门用于在SpringApplication的run()完成之前,执行Component组件的初始化方法。
这里的Component组件我理解为是被@Component注解修饰的类。
——它是依赖于Spring Boot应用的本身的生命周期的

传统Spring本身可以对组件执行初始化
——实现InitalizationBean接口,或通过init-method属性来指定初始化方法。
——这种方式所依赖的是Spring容器中Bean的生命周期行为。

代码示例:

program arguments --> 程序的命令行参数

aaa, bbb, --cc=ddd
aaa是一个命令参数,bbb是一个命令参数 , --cc=ddd 也是一个参数,叫选项参数,这个–cc=ddd参数是会被springboot自动解析的。

▲ 运行Spring Boot应用的两种命令行参数
   A。 传统的参数,直接列出一个一个的参数
   B。 双横线开头的选项参数,  这种参数包括了选项名和选项值。
  这种选项参数实际上就是对Spring Boot进行配置的参数,地位相当于application.properties文件配置,且优先级更高。

这种选项参数实际上就是对Spring Boot进行配置的参数,地位相当于application.properties文件配置,且优先级更高,会覆盖了application.properties 配置文件。

代码解释:
这里的代码只是演示项目启动时,在启动类springApplication的run()方法完成之前,ApplicationRunner接口和CommandLineRunner接口这两个接口的实现类Dog和Cat里面的run()方法会被自动调用。

具体要怎么在springApplication的run()方法完成之前做哪些额外操作或配置,需要根据实际业务去执行。

因为ApplicationRunner接口和CommandLineRunner接口的功能大致相同,区别就是ApplicationRunner接口的run方法使用 参数类型ApplicationArguments 获取参数更加方便。

下面的代码就是在演示ApplicationRunner接口通过ApplicationArguments获取参数的便利性。

在这里插入图片描述

在Program arguments 设置的配置的作用跟在 application.properties 配置文件设置的功能一样,但是在 Program arguments 这里设置的优先级高于 application.properties配置文件。
在这里插入图片描述

总结:主要演示两个Runner初始化器的实现方式,并对这两个初始化器获取参数进行比较。因为即使没有这两个初始化器,在启动配置那里对Program arguments进行的配置也没有任何影响,依然生效。所以这代码只是演示获取参数的便利性。就是能获取项目在启动的时候在Program arguments的一些配置。
其他的目前看不出有什么作用,因为也获取不到application.properties的配置。

代码:
cat

package cn.ljh.boot.domain;

import lombok.Data;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Data
@Component
public class Cat implements ApplicationRunner {
    private String addr;

    //ApplicationArguments 可以更方便的访问运行springboot的命令行参数
    //这个run方法用于对该Bean(这个Cat类)执行初始化,此处的args就代表了运行该应用的命令行参数
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.err.println("=====对Cat执行初始化=====");
        //获取原始的参数
        System.err.println("Cat的run方法,args命令行参数:" + Arrays.toString(args.getSourceArgs()));
        //获取非选项参数
        System.err.println("Cat的run方法,获取args里面的非选项参数:"+args.getNonOptionArgs());
        //获取选项参数名
        System.err.println("Cat的run方法,获取args里面的【选项参数名】:"+args.getOptionNames());
        //根据选项名获取对应的选项值
        for (String optionName : args.getOptionNames()) {
            System.err.println("Cat的run方法,获取args里面的【选项参数值】:  选项参数名:"
                    +optionName + "   选项参数值:" +args.getOptionValues(optionName));
        }
    }
}

dog

package cn.ljh.boot.domain;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Data
@Component //用这个注解修饰,意味着这个类是spring容器中的一个组件,springboot应用会自动加载该组件。
public class Dog implements CommandLineRunner {

    //将配置文件(myEnvironment.properties)里面的 myDogName 属性的值注入到这个字段里面
    @Value("${myDogName}")
    private String name;
    //将配置文件(myEnvironment.properties)里面的 myDogAge 属性的值注入到这个字段里面
    @Value("${myDogAge}")
    private int age;

    //无参构造器
    public Dog(){
        System.out.println("===创建Dog对象===");
    }
    //实现CommandLineRunner接口后要重写的方法
    //这个run方法用于对该Bean(这个Dog类)执行初始化,此处的args就代表了运行该应用的命令行参数
    @Override
    public void run(String... args) throws Exception {
        System.err.println("=====对Dog执行初始化=====");
        System.err.println("Dog的run方法的args参数:"+Arrays.toString(args));
    }
}

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

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

相关文章

python-网络爬虫.regular

regular 正则表达式 (regular expression) 正则表达式(regular expression)描述了一种字符串匹配的模式 (pattern), 可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串 中取出符合某个条件的子串等。 正则表达式是由普通…

gitlab配置webhook

一.前言 当需要做jenkins的自动化触发构建时,就需要配置gitlab的webhook功能,以下来展示以下如何配置gitlab的webhook,jenkins的配置就不在这里展示了,可以去看我devops文章的完整配置 二.配置 在新版本的gitlab中&#xff0c…

MySQL对表的操作以及数据类型

文章目录 创建删除表查看修改重命名表新增列修改列的属性删除列修改列名插入数据 数据类型enum和setenum和set的查找 创建 create table table_name ( field1 datatype, field2 datatype, field3 datatype ) charset 字符集 collate 校验规则 engine 存储引擎;其中field 表示列…

Linux - 环境变量

1.基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如:我们在编写C/C代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生…

超级个体新时代Web3space西南旗舰合伙人招募活动圆满落幕

7月30日,一场备受瞩目的超级个体新时代—Web3space西南旗舰合伙人招募活动在四川省成都市G1咖啡馆会议室成功举办。本次活动吸引了30余位Web3领域的从业者和爱好者参与,现场氛围十分热烈。 首先,CyberDAO执行合伙人JR老师主持了Web3space商业…

【AI实战】开源中文 llama2 来了,30 分钟搭建 130 亿参数大模型 Llama2-Chinese-13b-Chat

【AI实战】开源中文 llama2 来了,30 分钟搭建 130 亿参数大模型 Llama2-Chinese-13b-Chat 简介环境配置环境搭建依赖安装 代码及模型权重拉取拉取 Llama2-Chinese拉取 Llama2-Chinese-13b-Chat 模型权重及代码 终端测试页面测试安装 gradio加载模型并启动服务 国内 …

配置VS Code 使其支持vue项目断点调试

起因 每个应用,不论大小,都需要理解程序是如何运行失败的。当我们写的程序没有按照自己写的逻辑走的时候,我们就会逐步一一排查问题。在平常开发过程中我们可能会借助 console.log 来排查,但是现在我们可以借助 VS Code 断点来调试项目。 前…

Linux下查阅帮助文档必学命令 man

Linux操作系统的使用中,我们经常会遇到很多问题,这个时候查询文档的能力至关重要,黄老师来推荐大家使用man,这时我们必须掌握的查阅能力: 最常用的命令: man 名称 man 数字(1~9) 名称 这里的数字分别代表:

JavaWeb 项目实现(四) 验证旧密码

1.验证旧密码 步骤很简单,从Session中取到当前密码,和修改密码界面得到的旧密码对比,判断是否相等。 特别之处在于实现用到了Ajax,可以不刷新整个页面的情况下与Web服务器进行通信。 2.Ajax Ajax(Asynchronous Java…

使用Gunicorn+Nginx部署Flask项目

部署-开发机上的准备工作 确认项目没有bug。用pip freeze > requirements.txt将当前环境的包导出到requirements.txt文件中,方便部署的时候安装。将项目上传到服务器上的/srv目录下。这里以git为例。使用git比其他上传方式(比如使用pycharm&#xff…

深度学习之用PyTorch实现线性回归

代码 # 调用库 import torch# 数据准备 x_data torch.Tensor([[1.0], [2.0], [3.0]]) # 训练集输入值 y_data torch.Tensor([[2.0], [4.0], [6.0]]) # 训练集输出值# 定义线性回归模型 class LinearModel(torch.nn.Module):def __init__(self):super(LinearModel, self)._…

nodejs安装及多版本安装与TS环境搭建

nodejs安装及多版本安装与TS环境搭建 方法一: 普通安装nodejs,确定只能安装一个。网址:链接: 官网 不同系统下安装:不同系统下的nodejs 方法二: 借助工具nvm,安装多个nodejs,随时切换nodejs版本 什么是…

禁止别人调试自己的前端页面代码

✨ 目录 🎈 为啥要禁止?🎈 无限 debugger🎈 无限 debugger 的对策🎈 禁止断点的对策🎈 忽略执行的代码🎈 忽略执行代码的对策🎈 终极增强防调试代码 🎈 为啥要禁止&#…

简约好看的帮助中心创建案例,赶紧点赞收藏!

在线帮助中心创建案例是提供用户支持和解决问题的有效方式之一。一个简约好看的帮助中心案例能够帮助用户快速找到需要的信息并解决问题,同时也能提升用户体验,增加点赞和收藏的可能性。 帮助中心创建案例分享: 酷学院: 酷渲&a…

item_get-KS-获取商品详情

一、接口参数说明: item_get-根据ID取商品详情 ,点击更多API调试,请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/ks/item_get 名称类型必须描述keyString是调用key(http://o0b.cn/…

‘vite‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

1.切换到工程目录下 2.执行npm install(最关键的一步了!!) 3. 最后直接运行:npm run dev 4.浏览器直接打开就行了!

断网监测网关可以自动重启路由器

网络设备监测系统是一种用于监测远程网络设备状态的设备,它可以通过断网、断电和网线监测等多种方式进行监测。该系统支持同时监测7台网络设备,并且具有1路继电器输出,可以用于自动重启或者远程重启网络设备。 网络设备监测系统内置微型处理器…

VR 变电站事故追忆反演——正泰电力携手图扑

VR(Virtual Reality,虚拟现实)技术作为近年来快速发展的一项新技术,具有广泛的应用前景,支持融合人工智能、机器学习、大数据等技术,实现更加智能化、个性化的应用。在电力能源领域,VR 技术在高性能计算机和专有设备支…

前端代码注释率

nodejs差代码注释率 /*** author duan* source https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192* date 2023-7-7* * 统计指定目录下代码行数及注释率* * 用法: node count.js <路径> [后缀名]...* 后缀名不填的话默认为统计 .js 和 .ts 文件* *…

类Blip2的视觉文本多模态算法

一、Blip2出现的意义不比ChatGPT差 BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 论文链接&#xff1a;https://arxiv.org/abs/2301.12597 代码仓库&#xff1a;https://github.com/salesforce/LAVIS/tree/mai…