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

news2024/11/22 9:27:46

两个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就代表了运行该应用的命令行参数
    @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/821471.html

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

相关文章

一文读懂浏览器本地存储:Web Storage

一、 简介 二、localStorage 和 sessionStorage 2.1、区别 2.2、浏览器兼容性 三、使用说明 3.1、API介绍 3.2、浏览器查看 3.3、监听 四、存储 4.1、存储容量 4.2、存储性能 五、应用 5.1、使用习惯记录 5.2、首次打开提示 5.3、减少重复访问接口 六、总结 一、 …

在 3ds Max 中使用相机映射将静止图像转换为实时素材

推荐: NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 在 Photoshop 中准备图像 步骤 1 这是我将在教程中使用的静止图像。 这是我的静态相机纸箱的快照。 静止图像 步骤 2 打开 Photoshop。将图像导入 Photoshop。 打开 Photoshop 步骤 3 单击套索工…

计算机网络基础(静态路由,动态路由,公网IP,私网IP,NAT技术)

文章目录 一:静态路由和动态路由二:静态路由的配置路由信息的方式演示三:默认路由四:公网IP和私网IP和NAT技术的基本理解 一:静态路由和动态路由 在说静态路由和动态路由前,我们需要来了解一下&#xff0…

近2年入侵13家电信公司的幕后黑手浮出水面

10月20日,网络安全公司赛门铁克刚披露了一个针对南亚电信公司的神秘APT(高级持续威胁)组织,一个名为 LightBasin 的黑客组织被确定为针对电信行业发起一系列攻击的幕后黑手,其目标是从移动通信基础设施中收集“高度特定…

【iOS】GCD深入学习

关于GCD和队列的简单介绍请看:【iOS】GCD学习 本篇主要介绍GCD中的方法。 栅栏方法:dispatch_barrier_async 我们有时候需要异步执行两组操作,而且第一组操作执行完之后,才能开始执行第二组操作,当然操作组里也可以包含一个或者…

JVM之三大垃圾回收算法

文章目录 前言一、复制算法二、标记清除三、标记整理 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍…

Django实现音乐网站 ⑶

使用Python Django框架制作一个音乐网站,在系列文章2的基础上继续开发,本篇主要是后台单曲、专辑、首页轮播图表模块开发。 目录 后台单曲、专辑表模块开发 表结构设计 单曲表(singe)结构 专辑表(album&#xff09…

安达发|APS生产派单系统对数字化工厂有哪些影响和作用

数字化工厂是当今制造业的热门话题,而APS软件则是这一领域的颠覆者。它以其独特的影响和作用,给制造业带来了巨大的改变。让我们一起来看看APS软件对数字化工厂有哪些影响和作用吧! 提高生产效率的神器 1.APS软件作为数字化工厂的核心系统&a…

Jenkins工具系列 —— 启动 Jenkins 服务报错

错误显示 apt-get 安装 Jenkins 后,自动启动 Jenkins 服务报错。 排查原因 直接运行jenkins命令 发现具体报错log:Failed to start Jetty或Failed to bind to 0.0.0.0/0.0.0.0:8080或Address already in use 说明:这里提示的是8080端口号…

权威认可|云畅科技再次入选中国信通院「高质量数字化转型产品及服务全景图」

7月27日,由中国信通院主办的2023数字生态发展大会暨中国信通院“铸基计划”年中会议在北京成功召开。 会上,中国信通院重磅发布了「高质量数字化转型产品及服务全景图(2023)」,云畅科技凭借其自研产品「万应低代码」在…

【编程语言 · C语言 · 共用体指针】

【编程语言 C语言 共用体指针】https://mp.weixin.qq.com/s?__bizMzg4NTE5MDAzOA&mid2247491538&idx1&sne1941bffaa2b85d4a7932fa94bccc84d&chksmcfade32bf8da6a3d5fc729b29452259127a7ff63efd2ad77607b0d2f2c72250b86e1841e76d3&payreadticketHLky0Bq4…

从引入并集成多LLM到发布自研模型,RPA与LLM的融合进度怎样了?

RPA厂商对于大语言模型(LLM,Large Language Model)的应用,比大家想象的还要早一些。 毕竟,2019年兴起的这一波RPA热,背后都是因为AI技术。没有AI技术与RPA的融合,也就没有现在的RPA。 为了全力…

tinkerCAD案例:31. 3D 基元形状简介

tinkerCAD案例:31. 3D 基元形状简介 1 将一个想法从头脑带到现实世界是一次令人兴奋的冒险。在 Tinkercad 中,这将从一个新的设计开始。 在新设计中,简单的原始形状可以通过不同的方式组合成更复杂的形状。 在这个项目中,你将探索…

JNPF-一个真正可拓展的低代码全栈框架

一、前言 尽管现在越来越多的人开始对低代码开发感兴趣,但已有低代码方案的一些局限性仍然让大家有所保留。其中最常见的担忧莫过于低代码缺乏灵活性以及容易被厂商锁定。 显然这样的担忧是合理的,因为大家都不希望在实现特定功能的时候才发现低代码平台…

在win10下安装verilator

主要参考文章 Verilator简介及其下载安装卸载_徐晓康的博客的博客-CSDN博客https://blog.csdn.net/weixin_42837669/article/details/114505364上面的文章可以解决大部分问题,但是可能是方案有些老了,已经安装最新的版本,下面对最新的版本安装提供解决方案 一 预备工作 安…

python处理Excel常用模块:xlrd/xlwt/xlsxwriter/openpyxl/pandas/win32.com差异比较汇总以及常用使用方法

一、各模块优缺点比较 模块xlrdxlwt xlsxwriteropenpyxlpandaswin32.com读YESNONOYESYESYES写NOYESYESYESYESYES速度快快快比较快比较快超慢功能弱弱强一般一般超强执行速度 支持处理对xls、xlsx、xlsm,效率较高 只写,并且写入耗时较小,效率…

x 的平方根——力扣69

文章目录 题目描述法一 二分查找 题目描述 法一 二分查找 int mySqrt(int x){int l0, rx, ans-1;while(l<r){int mid (lr)/2;if((long long)mid*mid<x){ansmid;lmid1;} else {rmid-1;}}return ans;}

“用户登录”测试用例总结

前言&#xff1a;作为测试工程师&#xff0c;你的目标是要保证系统在各种应用场景下的功能是符合设计要求的&#xff0c;所以你需要考虑的测试用例就需要更多、更全面。鉴于面试中经常会问“”如何测试用户登录“”&#xff0c;我们利用等价类划分、边界值分析等设计一些测试用…

initDB时,数据库的ip地址、用户名、密码全都正确,但是连不上 oracle

选择解决方案。右击选中属性&#xff0c;修改生成的目标平台&#xff1a;

那到底是嵌入式累还是程序员累?

累的定义有很多&#xff0c;有体力上的&#xff0c;精力上的&#xff0c;也有心理上的&#xff0c;而心理的累才是真的累。 先来说说体力上的&#xff0c;现在不像60年代&#xff0c;上山砍柴扛几公里来挣钱&#xff0c;时代在进步&#xff0c;逐渐从体力到脑力转变。 以前那…