SpringBoot项目启动后执行指定方法的四种实现

这篇具有很好参考价值的文章主要介绍了SpringBoot项目启动后执行指定方法的四种实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今日的好天气
SpringBoot项目启动后执行指定方法的四种实现

距离上一次更新帖子已经过了很久很久,久到我也不知道我在搞什么飞机。
国庆节第一天终于搬到了新家,最近量子纠缠比较火,冬天也在路上,匆匆又一年。

方式一:方法上添加注解@PostConstruct

1、定义

@PostConstruct是Java自带的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。可作为一些数据的常规化加载,比如数据字典之类的。

从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。

2、@PostConstruct和@Autowired、构造函数的执行顺序

构造方法 > @Autowired > @PostConstruct

3、@PostConstruct使用时注意事项:

  1. 被注解方法不得有任何参数;
  2. 被注解方法返回值为void;
  3. 被注解方法不得抛出已检查异常;
  4. 被注解方法需是非静态方法;
  5. 此方法只会被执行一次;
  6. 耗时长的逻辑可放到独立线程中执行,减少Spring容器初始化时间

SpringBoot中Bean的加载过程,简单点说就是SpringBoot会把标记了Bean相关注解(例如@Component、@Service、@Repository等)的类或接口自动初始化全局的单一实例,如果标记了初始化顺序会按照用户标记的顺序,否则按照默认顺序初始化。在初始化的过程中,执行完一个Bean的构造方法后会执行该Bean的@PostConstruct方法(如果有),然后初始化下一个Bean。

那么: 如果@PostConstruct方法内的逻辑处理时间较长,就会增加SpringBoot应用初始化Bean的时间,进而增加应用启动的时间。因为只有在Bean初始化完成后,SpringBoot应用才会打开端口提供服务,所以在此之前,应用不可访问。

4、几点建议

所以,如果应用有一些初始化操作,有以下几点建议:

  1. 轻量的逻辑可放在Bean的@PostConstruct方法中
  2. 耗时长的逻辑如果放在@PostConstruct方法中,可使用独立线程执行
  3. 初始化操作放在CommandLineRunner或ApplicationRunner的实现组件中(马上讲到)

方式二:实现CommandLineRunner接口

1、定义

CommandLineRunner接口是在容器启动成功后的最后一步回调(类似开机自启动)。
可以通过@Order注解(属性指定数字越小表示优先级越高)或者Ordered接口来控制执行顺序。

2、使用

实现CommandLineRunner接口 然后在run方法里面调用需要调用的方法即可,好处是方法执行时,项目已经初始化完毕,是可以正常提供服务的。(与@PostConstruct区别之一)

同时该方法也可以接受参数,可以根据项目启动时: java -jar xxx.jar arg1 arg2 arg3 传入的参数进行一些处理。

@Component
@Order(value = 1)
public class StartRunnerOne implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println(">>>服务启动第一个开始执行的任务<<<<");
    }
}

@Component
@Order(value = 2)
public class StartupRunnerTwo implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println(">>>>服务第二顺序启动执行<<<<");
    }
}

方式三:实现ApplicationRunner接口

1、定义

ApplicationRunner接口是在容器启动成功后的最后一步回调(类似开机自启动)。

实现ApplicationRunner接口和实现CommandLineRunner接口基本是一样的,唯一的不同是启动时传参的格式,CommandLineRunner对于参数格式没有任何限制,更加松散一些,ApplicationRunner接口参数格式必须是:–key=value。

可以通过@Order注解(属性指定数字越小表示优先级越高)或者Ordered接口来控制执行顺序。

2、使用

@Component  //此类一定要交给spring管理
public class ConsumerRunner implements ApplicationRunner{
	@Override
	public void run(ApplicationArgumers args) throws Exception{
		//代码
		System.out.println("需要在springBoot项目启动时执行的代码---");
	}
}

方式四:实现ApplicationListener接口

1、定义

实现接口ApplicationListener方式和实现ApplicationRunner,CommandLineRunner接口都不影响服务,都可以正常提供服务,注意监听的事件,通常是ApplicationStartedEvent 或者ApplicationReadyEvent,其他的事件可能无法注入bean。

2、使用

@Component
public class ApplicationListenerImpl implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("listener");
    }
}

四种方式的执行顺序如何?

  • 注解方式@PostConstruct 始终最先执行
  • 如果监听的是ApplicationStartedEvent 事件,则一定会在CommandLineRunner和ApplicationRunner 之前执行。
  • 如果监听的是ApplicationReadyEvent 事件,则一定会在CommandLineRunner和ApplicationRunner 之后执行。
  • CommandLineRunner和ApplicationRunner 默认是ApplicationRunner先执行,如果双方指定了@Order 则按照@Order的大小顺序执行,数字越小优先级越高。

溜了,下期再见!文章来源地址https://www.toymoban.com/news/detail-413553.html

到了这里,关于SpringBoot项目启动后执行指定方法的四种实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 启动项目后执行方法的几种方式

    在项目开发中某些场景必须要用到启动项目后立即执行方式的功能,如我们需要去初始化数据到 redis 缓存、设置策略工厂,或者启动后读取相应的配置等,主要聊聊实现立即执行的几种方法。 这两者的实现方法一样,都是去继承相应的接口然后重写 run 方法即可,也都是 S

    2024年02月11日
    浏览(52)
  • Kotlin: 协程的四种启动模式(CoroutineStart)

    点击查看CoroutineStart英文文档 创建协程的三种方式 runBlocking 运行一个协程并且会阻塞当前线程,直到它完成。 launch 启动一个新的协程,不会阻塞当前线程,并且返回一个Job,可以取消。 async async和await是两个函数,这两个函数在我们使用过程中一般都是成对出现的。 async用

    2024年04月23日
    浏览(49)
  • SpringBoot导出Excel的四种方式

           近期接到了一个小需求,要将系统中的数据导出为Excel,且能将Excel数据导入到系统。对于大多数研发人员来说,这算是一个最基本的操作了。但是……我居然有点方!         好多年没有实操这种基础的功能了。我对于excel导入导出的印象还停留在才入行时的工作经

    2024年02月03日
    浏览(41)
  • springboot项目(jar包)指定配置文件启动

    在JetBrains IDEA开发工具的配置 在IDEA中的program arguments配置此项 --spring.profiles.active=dev 命令 在IDEA中的VM options配置此项 -Dspring.profiles.active=dev 命令 该启动时方式会去加载Jar包中resource目录下application-dev.yml或application-dev.properties文件。同时需要注意的是通IDEA的启动方式一样。 y

    2024年02月12日
    浏览(39)
  • IDEA下SpringBoot指定配置文件启动项目

    目录 一. idea下的SpringBoot启动:指定配置文件 二. 项目已打包,运行配置 1).使用java -jar启动基于(一)下的配置文件启动 2)指定项目内其它配置文件application-pro.yml启动项目 3) Linux服务器上启动基于(三)的springboot项目 三、开发过程中idea指定某种环境下的配置文件启动项目

    2024年02月06日
    浏览(62)
  • Hive的四种排序方法

    hive排序方法,hive的排序方式 hive有四种排序方法: ORDER BY 、SORT BY 、DISTRIBUTE BY 、CLUSTER BY 0. 测试数据准备 uuid dept salary 1001 研发部 16000 1002 市场部 17000 1003 销售部 11000 1004 研发部 15000 1005 销售部 12000 1006 研发部 21000 1007 产品部 16000 1008 研发部 18000 1009 市场部 17000 1010 产品部 16

    2024年02月02日
    浏览(42)
  • Springboot启动后执行方法

    使用注解@PostConstruct是最常见的一种方式,存在的问题是如果执行的方法耗时过长,会导致项目在方法执行期间无法提供服务。 实现CommandLineRunner接口 然后在run方法里面调用需要调用的方法即可,好处是方法执行时,项目已经初始化完毕,是可以正常提供服务的。 同时该方法

    2023年04月13日
    浏览(41)
  • 最大公约数的四种方法

    求两数的最大公约数,一共有四种方法:暴力穷举法、更相减损法、辗转相除法、stein 算法,小女不才,花了几天的时间终于把这几种方法全部弄明白,现在就把它们全部分享出来。 首先,假设被求的两个数为 x、y,且 x y。最大公约数 d = gcd (x , y) 正如名字所说,暴击穷举法

    2024年02月05日
    浏览(71)
  • 数据的四种基本存储方法

    数据的存储结构可用以下四种基本存储方法得到: ( 1 )顺序存储方法     该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。     由此得到的存储表示称为顺序存储结构  (Sequential Storage Structure),通常借

    2024年02月15日
    浏览(45)
  • 检测数据类型的四种方法

    一、数据类型: 1、基本数据类型:String、Number、Boolean、Null、Undefined、Symbol 、BigInt 2、引用数据类型:Object、Array、Function、Date、RegExp 二、检测数据类型的四种方法 1.typeof检测   特点:typeof只能检测基本数据类型(除了null),不能准确的检测引用数据类型。 object、array、

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包