SpringBoot实现项目启动时执行代码

背景

图片
图片
在项目开发过程中,有时候需要在项目启动时预加载一些资源,例如提前加载某些数据、执行某个方法、初始化SQL脚本、提前实例化一些类等。那么提前加载的方式有哪些呢?接下来一一为大家介绍。
图片
图片

实现方式

图片
图片
实现项目启动时执行代码方式有好几种,总结起来有两类,分别是Java方式和Spring方式。
1. Java启动加载方式
包括static代码块、构造方法及PostConstruct注解,Spring启动加载方式包括实现CommandLineRunner接口以及实现ApplicationRunner接口方式。下面分别通过例子来讲解。

方式一:static代码块

通过static声明静态代码块,实现在类加载时自动加载,使用方式如图:
图片

方式二:构造方法

在对象初始化时自动执行,使用方式如图:
图片

方式三:PostConstruct注解

@PostConstruct是Java提供的一个注解,用来修饰一个非静态的void()方法,被修饰的方法会在Spring加载Bean时运行,并且只会运行一次,使用方式如图:
图片
上述三种都是Java实现启动加载的方式,那么他们之间的加载先后顺序如何呢
我们把三种方式放到同一个类中测试下,如图:
图片
启动项目测试,可以看到加载的顺序依次为:
static代码块->构造方法->PostConstruct注解。
图片

2. Spring启动加载方式

方式一:实现CommandLineRunner接口

CommandLineRunner是SpringBoot提供的接口,实现它需要实现run方法,run方法中就是可以在项目启动后执行的内容。
图片

方式二:实现ApplicationRunner接口

ApplicationRunner也是SpringBoot提供的接口,实现方式和CommandLineRunner基本一致,区别在于入参不同,一个是String数组,一个是ApplicationArguments对象。
图片
上述两种是Spring实现启动加载的方式,那么它两之间的加载顺序如何呢?经过测试,他们的加载顺序是由Spring容器加载Bean的顺序决定的。
那么,如果想自定义类的加载顺序,该如何做呢?我们可以通过@Order注解来实现,该注解的作用是用来定义Spring容器中Bean执行顺序的优先级。需要注意的是,这里定义的是Bean的执行优先级,而不是Bean加载顺序,实际上Bean的加载顺序不受该注解影响。
图片
图片

总结

图片
图片
Spring应用启动过程中,Spring会扫描所有Bean,并且自动加载并初始化后注入。加载类时会执行static代码块,初始化对象时执行构造方法,对象注入后,会调用有@PostConstruct注解的方法。当容器启动完成后,会根据@Order注解顺序依次调用实现了ApplicationRunner和CommandLineRunner接口的run方法。
以上就是实现项目启动时执行方法的几种方式,我们可以在项目开发中灵活选用,根据不同场景使用不同方法。
本 文 原 创 来 源:IT那活儿微信公众号(上海新炬王翦团队)

发表评论

登录后才能评论
网站客服
网站客服
申请收录 侵权处理
分享本页
返回顶部