15、两个Runner初始化器和 springboot创建非web应用

两个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的配置。

ApplicationArguments 解释

简单来说: 只要你的任意组件(@Component注解修饰的类)希望访问Spring Boot应用的运行参数,都可以定义一个ApplicationArguments类型的成员变量,并使用@Autowired修饰它,Spring将会完成依赖注入。

什么是ApplicationArguments ?
ApplicationArguments 是Runner初始化器---->ApplicationRunner接口实现类的Run方法里面的参数类型。

上面介绍的是这个ApplicationArguments 可以非常方便的访问运行参数(这里的运行参数是指项目启动的时候的一些配置参数)。而且不局限于在Runner初始化器中使用。

只要这个类添加了@Component注解,那么这个类(也可以叫组件) 就可以使用这个ApplicationArguments 对象来获取一些运行参数。通过依赖注入的方式使用

【注意:】 由于依赖注入,一定是在对象被创建出来之后才会完成,因此不能在组件的构造器中调用ApplicationArguments来访问应用程序的运行参数。

因为这个类要先通过构造器创建出来,再进行对这个ApplicationArguments依赖注入来使用,如果在构造器里面调用ApplicationArguments对象的一些方法,那么会因为对象还没创建出来,所以还没有到注入ApplicationArguments对象这一步,所以其实还没有这个依赖可以使用,就会出问题。我们可以在自己定义的方法中来调用ApplicationArguments。

代码示例:
只要我们的类想要访问到springboot项目的运行参数,就可以通过ApplicationArguments这个API来获取。记得这个类得用@Component注解修饰。
在这里插入图片描述
项目的运行参数,可以在这里设置添加。
在这里插入图片描述

springboot创建非web应用

当Spring Boot应用带有Spring MVC或Spring WebFlux依赖时,Spring Boot都会自动创建Web应用。
要显式创建非Web应用,可设置:▲方法1: 通过SpringApplication对象来设置
var application = new SpringApplication(App.class);
// 设置创建非Web应用
application.setWebApplicationType(WebApplicationType.NONE);▲ 方法2:用SpringApplicationBuilder通过流式编程来设置new SpringApplicationBuilder().sources(App.class)// 创建非Web应用.web(WebApplicationType.NONE).run();▲ WebApplicationType.NONE有3个枚举值:- SERVLET: 对应Spring MVC的默认值。- REACTIVE:对应于Spring WebFlux的默认值。- NONE:非Web应用
【备注】:如果使用SpringApplication的静态run()方法来启动Spring Boot应用,那将意味着一切都用默认的行为。

方法1:通过SpringApplication对象来设置

在这里插入图片描述

方法2:用SpringApplicationBuilder通过流式编程来设置

在这里插入图片描述


代码:
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就代表了运行该应用的命令行参数@Overridepublic 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就代表了运行该应用的命令行参数@Overridepublic void run(String... args) throws Exception {System.err.println("=====对Dog执行初始化=====");System.err.println("Dog的run方法的args参数:"+Arrays.toString(args));}
}

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

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

相关文章

【原创】IPTVC2实现方案(文末有demo)

前言: 名词解释: IPTVC2, 全称: 央视国际节目定价发布接口规范,标准版本当前最新为2.7.12 附赠资源链接,侵删:规范 规范中提供的样例,实现基于axis1.4(2006的时代宠物) 基于axis1版本的实现参考: Spring boot 集成Axis1.4 ,使用wsdd文件发…

【CSDN】

欢迎使用Mark编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#xff0c…

自动驾驶感知系统-全球卫星定位系统

卫星定位系统 车辆定位是让无人驾驶汽车获取自身确切位置的技术,在自动驾驶技术中定位担负着相当重要的职责。车辆自身定位信息获取的方式多样,涉及多种传感器类型与相关技术。自动驾驶汽车能够持续安全可靠运行的一个关键前提是车辆的定位系统必须实时…

【数学建模】——拟合算法

【数学建模】——拟合算法 拟合算法定义:与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好&…

好用的Linux远程工具

你好,我是Martin,今天给大家介绍几款主流的远程工具。 远程工具介绍 关于远程连接的用户分类时这样的,通常需要进行远程连接的人有两类,一类是系统管理员,另一类是普通的用户。远程连接工具是一些可以让你通过网络连接…

2023年华数杯建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米,宽为12米&#xff0…

Nacos配置中心设置Mongodb

目录 1.common模块导入nacos config依赖 2.common模块新建bootstrap.yaml 3.在自己的模块导入common模块依赖 4.打开nacos新建配置,发布 5.运行服务并测试 效果:在部署完成后,其他人可以自动连接到你本地mongoDB数据库,无需再…

建模教程:如何利用3ds Max 和 After Effects 实现多通道渲染和后期合成

推荐: NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 创建基本场景 步骤 1 打开 3ds Max。 打开 3ds Max。 步骤 2 我做了一个简单的场景。我放了三个 彼此之间有一定距离的物体。 制作对象 步骤 3 按 Ctrl-C 键 在透视视图中创建摄影机。 创建相机 …

Android性能优化—LeakCanary内存泄漏检测框架分析。

一、什么叫内存泄漏、内存溢出? 内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个10M的Bitmap,但系统分配给APP的连续内存不足10M&#xff0c…

P3372 【模板】线段树 1(内附封面)

【模板】线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上 k k k。求出某区间每一个数的和。 输入格式 第一行包含两个整数 n , m n, m n,m,分别表示该数列数字的个数和操作的总个数。 …

数据库管理员知识图谱

初入职场的程序猿,需要为自己做好职业规划,在职场的赛道上,需要保持学习,并不断点亮自己的技能树。  成为一名DBA需要掌握什么技能呢,先让Chat-GPT为我们回答一下: 数据库管理系统 (DBMS)知识&#xff…

B079-项目实战--支付模块 定时任务 项目总结

目录 概述示例jar包配置类任务详情 项目应用封装的工具类QuartzUtils封装IQuartzSrvice和QuartzServiceImpl封装参数QuartzJobInfo编写任务逻辑MainJob调用第三方支付前添加定时任务异步回调后移除定时任务 订单支付整体流程 概述 优势:Tmer不支持持久化&#xff0…

Java的JDBC编程

目录 一、概念 二、Java代码操作MySQL 1、创建一个项目 2、引入MySQL的驱动包,作为项目的依赖 3、把 jar包 导入到项目中 4、创建一个数据源 5、建立网络上的连接 6、构造SQL语句 7、执行 sql 语句 8、释放必要的资源.关闭连接 一、概念 JDBC ,即…

【Jquery大事件时间线】jquery实现大事件时间线(时间轴)的滚动切换效果『附完整源码』

文章目录 写在前面涉及知识点页面效果1、搭建框架1.1 模块搭建1.2 内容填充1.3 时间线的切换 2、完整代码2.1 html源码2.2 CSS源码2.3 js源码 3、完整源码包下载3.1百度网盘3.2 123云盘3.3邮箱留言 总结 写在前面 其实这种大事件记录的web页面也是我们常见的,尤其是…

Go语言性能优化建议与pprof性能调优详解——结合博客项目实战

文章目录 性能优化建议Benchmark的使用slice优化预分配内存大内存未释放 map优化字符串处理优化结构体优化atomic包小结 pprof性能调优采集性能数据服务型应用go tool pprof命令项目调优分析修改main.go安装go-wrk命令行交互界面图形化火焰图 性能优化建议 简介: …

使用redis-cli操作redis

redis-cli是原生redis自带的命令行工具,可以帮助我们通过简单的命令连接redis服务,并进行数据管理,即redis键(key)和redis数据结构的管理。 关于如何进入redis-cli命令行客户端,请查看文章:Redi…

CMake:为Eigen库使能向量化

CMake:为Eigen库使能向量化 导言构建Eigen项目结构CMakeLists.txt相关源码 导言 本篇开始将涉及检测外部库相关的内容,期间会穿插着一些其他的内容。为了能够使得系统在系统中运行Eigen库,我们首先需要在系统中配置好Eigen库。然后介绍与Eigen库相关的C…

【Android】APP启动优化学习笔记

启动优化目的 用户体验: 应用的启动速度直接影响用户体验。用户希望应用能够快速启动并迅速响应他们的操作。如果应用启动较慢,用户可能会感到不满,并且有可能选择卸载或切换到竞争对手的应用。通过启动优化,可以提高应用的启动…

132个心理性格趣味测试ACCESS\EXCEL数据库

今天又遇到了一个心理测试的数据库,这个数据库在表结构的设置上很直观,属于那种好的数据库结构,共分三个表,一个是测试项目描述表、一个是测试题选项得分表、一个是根据得分区间解析表,表与表之间通过“question_id”字…

【Python】pyqt6入门到入土系列,非常详细...

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 一、什么是PyQt6? 简单介绍一下PyQt6 1、基础简介 PyQt6 Digia 公司的 Qt 程序的 Python 中间件。Qt库是最强大的GUI库之一。 PyQt6的官网:www.riverbankcomputing.co.uk/news。 PyQt6是由Riverbank Co…