springboot源码分析-监听器实现原理(下)

Posted 猿起缘灭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot源码分析-监听器实现原理(下)相关的知识,希望对你有一定的参考价值。

本文承接上文:springboot源码分析(五)-监听器实现原理(中)

开篇之前先把祖师爷搬出来
  费玉清:问大家一个脑筋急转弯,高个子女生,打一种化妆品,很常见的那种
      思考。。。
      思考。。。
      思考。。。
  揭晓谜底:唇膏
  反正谜底我已经揭晓了,至于大家能不能看到,我就不管了,哈哈
 

概述

  上一篇文章已经把springboot中的监听器从源码的角度分析了一遍,有兴趣的可以去看一下,如果不想看源码,只是看一下如何自定义监听器,也可以一下这篇文章,这篇文章主要介绍一下自定义监听器的方法,以及如何让自定义的监听器生效,初次之外呢,还会介绍一下springboot在启动过程中都有哪些事件,执行的顺序是什么。

 

自定义监听器

通过实现ApplicationListener自定义监听器

@Order(1)
public class FirstApplicationListener implements ApplicationListener<ApplicationStartedEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
        System.out.println("first, springboot start");
    }
}

这是第一个监听器,我们实现了ApplicationListener接口,并且在接口中我们指定了ApplicationStartedEvent作为我们感兴趣的事件,当springboot启动是,调用到 listeners.starting(); 的时候,就会被我们自定义的监听器监听到,会执行我们重写的onApplicationEvent方法。

我们还是老规矩,在resource目录下新建META-INF目录,之后在这个目录下新建spring.factories文件,在文件中加入如下配置项

org.springframework.context.ApplicationListener=com.example.demo.listener.FirstApplicationListener

等号后面是我们自定义的监听器的路径,大家根据自己的路径填写。

ok我们启动springboot项目,可以看到如下打印结果:

  .   ____          _            __ _ _
 /\\\\ / ___\'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\
( ( )\\___ | \'_ | \'_| | \'_ \\/ _` | \\ \\ \\ \\
 \\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  \'  |____| .__|_| |_|_| |_\\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.6.RELEASE)

firstApplicationContextInitializer is start
thirdApplicationContextInitializer is start
secondApplicationContextInitializer is start
2020-06-04 19:58:56.194  INFO 56577 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication on ganxinledeMacBook-Pro.local with PID 56577 (/Users/ganxinle/workspace/demo/target/classes started by ganxinle in /Users/ganxinle/workspace/demo)
2020-06-04 19:58:56.197  INFO 56577 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2020-06-04 19:58:56.920  INFO 56577 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-06-04 19:58:56.929  INFO 56577 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-06-04 19:58:56.930  INFO 56577 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.33]
2020-06-04 19:58:56.987  INFO 56577 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-06-04 19:58:56.987  INFO 56577 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 752 ms
2020-06-04 19:58:57.115  INFO 56577 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService \'applicationTaskExecutor\'
2020-06-04 19:58:57.243  INFO 56577 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path \'\'
2020-06-04 19:58:57.246  INFO 56577 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 1.328 seconds (JVM running for 1.662)
first, springboot start

说明我们的配置成功了,但是有的小伙伴可能有疑问,为什么是最后打印的,这个有兴趣的小伙伴自己去探究,我没有深究

以上是关于springboot源码分析-监听器实现原理(下)的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot内置生命周期事件详解 SpringBoot源码(十)

SpringBoot内置生命周期事件详解 SpringBoot源码

SpringBoot内置生命周期事件详解 SpringBoot源码

SpringBoot启动流程分析:SpringBoot自动装配原理实现

SpringBoot源码之Tomcat加载原理分析

springboot源码解析-从源码角度分析系统初始化器的实现原理