springboot 项目容器启动后如何自动执行指定方法

 更新时间:2021年11月09日 10:31:16   作者:笙箫123  
这篇文章主要介绍了springboot 项目容器启动后如何自动执行指定方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

springboot 项目容器启动后自动执行指定

我们需要写一个class去让它实现ApplicationRunner,然后重写它的run方法就行了,注意类加上@Component注解

注意:这个class需要写在和Application启动类的同级目录或者子级目录下,否则不生效。

代码:

package com.qq.weixin; 
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
 
/**
 * @author XuYangWei
 * @Date 2021/1/22 8:56
 */
@Slf4j
@Component
public class TestRuner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        log.info("我是Spring容器启动后立即执行的方法,当前时间:"+ DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
    }
}

springboot 容器及启动过程

SpringBoot会启动两个容器,即父子容器

  • 父容器(Spring容器):AnnotationConfigWebApplicationContex
  • 子容器(SpringMVC容器):AnnotationConfigEmbeddedWebApplicationContex

思考几个问题:

问题1:为什么要启动父子两个容器?

在Spring整体框架的核心概念中,容器是核心思想,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,使用上下层关系来管理容器可以解决公共属性抽取的问题,即将公共的属性放到父容器中,对其各个子容器均可见,实现了复用功能,注意子容器对父容器是不可见的。

问题2:在什么时候启动父容器?

准备环境变量,即执行prepareEnvironment方法时,发布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener监听器收到该事件,会初始化父容器

问题3:父容器和子容器的区别?

1.子容器中会创建植入的tomcat容器类,用来管理tomcat服务,父容器没有

2.父容器管理的bean集合是spring框架内置的一些bean,子容器管理的bean集合是我们业务定义的bean以及spring框架内置的bean

问题4:怎么保证父容器启动过程中

执行prepareEnvironment方法时,BootstrapApplicationListener监听器不再重复执行?

父容器初始化完成后,会在webEnvironment属性中加入bootstrap属性标识,这样就可以根据该标识来判断是否需要执行了

问题5:容器实际通过什么来管理bean

容器通过beanFactory来管理对象,父子容器都会各持有一个DefaultListableBeanFactory,即父子容器都会管理各自的bean。

子容器启动流程:

1.执行初始化:初始化webEnvironment以及listeners

2.发布容器启动事件

3.在执行prepareEnvironment步骤时,发布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener监听器收到该事件,会再次调用SpringApplication

  • 初始化和run方法(初始化父容器的步骤类似子容器)

4.创建context,通过判断webEnvironment标识,这时为true,创建AnnotationConfigEmbeddedWebApplicationContext实例

5.执行refreshContext,比较核心的方法,详细说一下:

  • 获取bean工厂,即创建DefaultListableBeanFactory实例
  • 为bean工厂赋一些基础属性,主要有类加载器
  • 为bean工厂注册WebApplicationContextServletContextAwareProcessor,一个BeanPostProcessor,主要用于获取ServletContext
  • 执行beanFactoryPostProcessor,递归处理,主要用于扫描@CompontScan、@Import、@ImportSource等注解的类,首先注册bean元数据到工厂,然后可以修改bean工厂
  • 实例化BeanPostProcessor类并注册到bean工厂单例列表中
  • 实例化消息通知类并注册到bean工厂单例列表中
  • 调用onRefresh方法,初始化一个植入的tomcat容器
  • 注册监听器到消息通知器中,区分为两类:一、从系统配置中加载的监听器(已实例化) 二、已注册但还未实例化的监听器
  • 实例化注册表中的所有bean,创建bean的过程中会执行bean的初始化操作,会执行BeanPostProcessor、afterPropertiesSet、初始化方法等等
  • 调用finishRefresh,启动所有bean,发布ContextRefreshed事件

6.执行afterRefresh,调用实现了ApplicationRunner/CommandLineRunner接口的bean run方法

7.发布ApplicationReadyEvent事件

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 完整的logback配置示例ELK整合包含生成json日志

    完整的logback配置示例ELK整合包含生成json日志

    这篇文章主要为大家介绍了完整的logback配置示例ELK整合包含生成json日志,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • SpringBoot SpringEL表达式的使用

    SpringBoot SpringEL表达式的使用

    本文主要介绍了SpringEL表达式的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 如何查找YUM安装的JAVA_HOME环境变量详解

    如何查找YUM安装的JAVA_HOME环境变量详解

    这篇文章主要给大家介绍了关于如何查找YUM安装的JAVA_HOME环境变量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • 通过Spring自定义NamespaceHandler实现命名空间解析(推荐)

    通过Spring自定义NamespaceHandler实现命名空间解析(推荐)

    这篇文章主要介绍了通过Spring自定义NamespaceHandler实现命名空间解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • RabbitMQ 的七种队列模式和应用场景

    RabbitMQ 的七种队列模式和应用场景

    最近学习RabbitMQ,本文就记录一下RabbitMQ 的七种队列模式和应用场景,方便以后使用,也方便和大家共享,相互交流
    2021-05-05
  • SpringBoot实现阿里云快递物流查询的示例代码

    SpringBoot实现阿里云快递物流查询的示例代码

    本文将基于springboot实现快递物流查询,物流信息的获取通过阿里云第三方实现,具有一定的参考价值,感兴趣的可以了解一下
    2021-10-10
  • Mybatis-Plus 条件构造器 QueryWrapper 的基本用法

    Mybatis-Plus 条件构造器 QueryWrapper 的基本用法

    这篇文章主要介绍了Mybatis-Plus - 条件构造器 QueryWrapper 的使用,通过实例代码给大家介绍了查询示例代码及实现需求,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • java实现归并排序算法

    java实现归并排序算法

    在学习算法的过程中,我们难免会接触很多和排序相关的算法。总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的。那么现在我们将要进行基本的归并排序算法的讲解
    2016-01-01
  • Java如何优雅地避免空指针异常(NullPointerException)

    Java如何优雅地避免空指针异常(NullPointerException)

    这篇文章主要给大家介绍了关于Java如何优雅地避免空指针异常(NullPointerException)的相关资料,空指针异常(NullPointerException)是一种常见的运行时异常,它在Java编程中经常出现,需要的朋友可以参考下
    2024-03-03
  • Spring中基于xml的AOP的详细步骤

    Spring中基于xml的AOP的详细步骤

    这篇文章主要介绍了Spring中基于xml的AOP的详细步骤,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论