资讯专栏INFORMATION COLUMN

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

IT那活儿 / 1498人阅读
SpringBoot实现项目启动时执行代码

点击上方“IT那活儿”,关注后了解更多精彩内容!!

背景

在项目开发过程中,有时候需要在项目启动时预加载一些资源,例如提前加载某些数据、执行某个方法、初始化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那活儿微信公众号(上海新炬王翦团队)


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129693.html

相关文章

  • 一个网站的微服务架构实战(1)docker和 docker-compose

    摘要:文件服务器项目为文章共享社区,少不了的就是一个存储文章的文件服务器,包括存储一些图片之类的静态资源。例如数据库的数据文件的配置文件和文件服务器目录。 前言 这是一次完整的项目实践,Angular页面+Springboot接口+MySQL都通过Dockerfile打包成docker镜像,通过docker-compose做统一编排。目的是实现整个项目产品的轻量级和灵活性,在将各个模块的镜像...

    CODING 评论0 收藏0
  • SpringBoot原理深入篇

    摘要:启动原理和执行原理分析一的启动原理我们打开,注意看下面两个依赖我们第一步是继承了父项目,然后在添加启动器的依赖,项目就会自动给我们导入关于项目所需要的配置和。 上一篇我们看到,我们很轻松的完成了项目的构建,那么SpringBoot是如何做到的呢,在使用的使用又有哪些通用配置和注意事项呢? 其实SpringBoot给我们做了大量的自动配置功能,我们只需要引入对应的启动器就可以直接使用,作...

    gotham 评论0 收藏0
  • 猫头鹰的深夜翻译:使用SpringBoot和AspectJ实现AOP

    摘要:我们会写切面来拦截对这些业务类和类的调用。切面定义何时拦截一个方法以及做什么和在一起成为切面连接点当代码开始执行,并且切点的条件满足时,通知被调用。 前言 这篇文章会帮助你使用Spring Boot Starter AOP实现AOP。我们会使用AspectJ实现四个不同的通知(advice),并且新建一个自定义的注解来追踪方法的执行时间。 你将会了解 什么是交叉分割关注点(cross...

    meislzhua 评论0 收藏0
  • SpringBoot热部署加持

    摘要:概述进行的开发过程中,我们很多时候经常需要重启服务器才能保证修改的源代码文件或者一些诸如的配置文件以及一些静态文件生效,这样耗时又低效。 showImg(https://segmentfault.com/img/remote/1460000015363888); 概述 进行SpringBoot的Web开发过程中,我们很多时候经常需要重启Web服务器才能保证修改的 源代码文件、或者一些...

    ixlei 评论0 收藏0
  • 如何优雅关闭 Spring Boot 应用

    摘要:除了,还有十余种,有的是特定操作,比如转储内存日志有的是信息展示,比如显示应用健康状态。 showImg(http://ww1.sinaimg.cn/large/006tNc79gy1g5qb2coyfoj30u00k0tan.jpg); 前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kil...

    xiyang 评论0 收藏0
  • SpringBoot RabbitMQ 整合使用

    摘要:可以在地址看到如何使用讲解下上面命令行表示控制台端口号,可以在浏览器中通过控制台来执行的相关操作。同时从控制台可以看到发送的速率多线程测试性能开了个线程,每个线程发送条消息。 showImg(http://ww2.sinaimg.cn/large/006tNc79ly1g5jjb62t88j30u00gwdi2.jpg); 前提 上次写了篇文章,《SpringBoot Kafka 整合...

    yuanxin 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<