您现在的位置是:首页 > 正文

探究SpringBoot启动时实现自动执行代码

2024-01-30 22:06:21阅读 0

前言

目前开发的SpringBoot项目在启动的时候需要预加载一些资源。而如何实现启动过程中执行代码,或启动成功后执行,是有很多种方式可以选择,我们可以在static代码块中实现,也可以在构造方法里实现,也可以使用@PostConstruct注解实现,当然也可以去实现Spring的ApplicationRunner与CommandLineRunner接口去实现启动后运行的功能。在这里整理一下,在这些位置执行的区别以及加载顺序。

java自身的启动时加载方式

static代码块

static静态代码块,在类加载的时候即自动执行。

构造方法

在对象初始化时执行。执行顺序在static静态代码块之后。

Spring启动时加载方式

@PostConstruct注解

PostConstruct注解使用在方法上,这个方法在对象依赖注入初始化之后执行。

ApplicationRunner和CommandLineRunner

SpringBoot提供了两个接口来实现Spring容器启动完成后执行的功能,两个接口分别为CommandLineRunner和ApplicationRunner。
这两个接口需要实现一个run方法,将代码在run中实现即可。这两个接口功能基本一致,其区别在于run方法的入参。ApplicationRunner的run方法入参为ApplicationArguments,为CommandLineRunner的run方法入参为String数组。

何为ApplicationArguments

官方文档解释为:Provides access to the arguments that were used to run a SpringApplication.在Spring应用运行时使用的访问应用参数。即我们可以获取到SpringApplication.run(…)的应用参数。
参考资料:
Interface ApplicationArguments
CommandLineRunner或者ApplicationRunner接口

Order注解

当有多个类实现了CommandLineRunner和ApplicationRunner接口时,可以通过在类上添加@Order注解来设定运行顺序。

代码测试

为了测试启动时运行的效果和顺序,编写几个测试代码来运行看看。

TestPostConstruct

@Component
public class TestPostConstruct {

    static {
        System.out.println("static");
    }
    public TestPostConstruct() {
        System.out.println("constructer");
    }

    @PostConstruct
    public void init() {
        System.out.println("PostConstruct");
    }
}

TestApplicationRunner

@Component
@Order(1)
public class TestApplicationRunner implements ApplicationRunner{
    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        System.out.println("order1:TestApplicationRunner");
    }
}

TestCommandLineRunner

@Component
@Order(2)
public class TestCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... strings) throws Exception {
        System.out.println("order2:TestCommandLineRunner");
    }
}

执行结果

启动顺序

总结

Spring应用启动过程中,肯定是要自动扫描有@Component注解的类,加载类并初始化对象进行自动注入。加载类时首先要执行static静态代码块中的代码,之后再初始化对象时会执行构造方法。在对象注入完成后,调用带有@PostConstruct注解的方法。当容器启动成功后,再根据@Order注解的顺序调用CommandLineRunner和ApplicationRunner接口类中的run方法。因此,加载顺序为static>constructer>@PostConstruct>CommandLineRunner和ApplicationRunner.

网站文章

  • 未授予用户在此计算机上的请求登录…

    未授予用户在此计算机上的请求登录…

    问题一:提示:登录失败:未授予用户在此计算机上的请求登录类型。 Windows 运行窗口,输入局域网地址,如\\192.168.1.19。提示: \\192.168.1.19无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。 登录失败:未授予用户在此计算机上的请求登录类型。 解决方法(已经验证):控制面板——凭据管理器——添加Windows凭...

    2024-01-30 22:06:15
  • 阿里云总裁张建锋:“未来不懂低代码就像二十年前不会用word”

    阿里云总裁张建锋:“未来不懂低代码就像二十年前不会用word”

    未来80%的应用由业务人员开发

    2024-01-30 22:06:08
  • ias 配置服务器 文件属性,WX5002与Windows IAS配合实现同一SSID不同VLAN功能(即动态mac-vlan功能)的典型配置...

    ias 配置服务器 文件属性,WX5002与Windows IAS配合实现同一SSID不同VLAN功能(即动态mac-vlan功能)的典型配置...

    WX5002与Windows IAS配合实现同一SSID不同VLAN功能(即动态mac-vlan功能)的典型配置适用WX5002版本:Comware Software, Version 5.20, R...

    2024-01-30 22:06:01
  • excel表计算机实践操作,Excel电子表格计算机实践任务书

    《Excel电子表格计算机实践任务书》由会员分享,可在线阅读,更多相关《Excel电子表格计算机实践任务书(12页珍藏版)》请在装配图网上搜索。1、1,计算机实践 Excel2003电子表格,2,一、...

    2024-01-30 22:05:30
  • 程序员怎么找工作?程序员找工作越来越难怎么办?

    程序员怎么找工作?程序员找工作越来越难怎么办?

    最近互联网大厂裁员的消息很多,直接原因还是来自于业绩压力。对于互联网公司而言,在外部公司空间增长猥琐的背景下。想要改善业绩,最直接到底方法还是裁员,所以很多人问,程序员怎么找工作?找工作越来越难怎么办...

    2024-01-30 22:05:25
  • 实战|手把手教你用Python爬虫(附详细源码)

    实战|手把手教你用Python爬虫(附详细源码)

    实践来源于理论,做爬虫前肯定要先了解相关的规则和原理,要知道互联网可不是法外之地,你一顿爬虫骚操作搞不好哪天就…首先,咱先看下爬虫的定义:网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。一句话概括就是网上信息搬运工。

    2024-01-30 22:04:49
  • 使用stream把对象中的属性过滤出来后转成list后求和

    使用stream把对象中的属性过滤出来后转成list后求和 写一个简单的例子 相信聪明如你一看就懂 User user = new User("a",1,"男"...

    2024-01-30 22:04:43
  • Nexus上传jar包到私有Maven仓库的方法: 页面Upload 和命令

    Nexus上传jar包到私有Maven仓库的方法: 页面Upload 和命令

    选择Upload,选择要上传的目标仓库,选择 File 填写 Group ID 等,最重要的是要点选。命令两种上传方式的应用场景不同,手动上传适用于工具类的。文件,这种可以选择手动上传。复杂的、有较多依赖的。文件一起上传,此时需要使用。包,比如项目需要引入的。不勾选,上传成功后没有。

    2024-01-30 22:04:35
  • 进程互斥与同步计算机操作系统_操作系统心得体会

    进程互斥与同步计算机操作系统_操作系统心得体会

    一、操作系统1.基本概念操作系统简称OS,是配置在计算机硬件上的第一层软件,它能够有效的组织和管理计算机系统中的硬件和软件资源,合理的组织计算机工作流程,控制程序的执行,并向用户提供各种服务功能。OS...

    2024-01-30 22:04:07
  • MySQL事务基础知识

    MySQL事务基础知识

    目录1.数据库事务概述1.1 存储引擎支持情况1.2 事务基本概念1.3 事务的ACID特性1.4 事务的状态2.如何使用事务3.事务的隔离级别4.事务的常见分类1.数据库事务概述1.1 存储引擎支持...

    2024-01-30 22:03:59