Spring 全家桶之 Spring Boot 2.6.4(九)- 启动流程解析(四)

简介: Spring 全家桶之 Spring Boot 2.6.4(九)- 启动流程解析

三、Spring Boot 事件监听机制

在启动流程中,有几个监听器非常重要

  • ApplicationContextInitializer
  • SpringApplicationRunListener
  • ApplicationRunner
  • CommandLineRunner 可以自定义监听器实现这些提供的监听器,通过启动应用看这些监听器在什么时候运行

实现自定义的ApplicationContextListener

ApplicationContextListener接口中包含了一个initialize()方法

e5340d4d36d94a3096c511a844e13c23_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

自定义监听器HalloApplicationContextListener并实现ApplicationContextListener接口,泛型为ConfigurableApplicationContext,既监听IOC容器的启动。

public class HalloApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("自定义的" + this.getClass().getName() + "运行了,IoC容器:" + applicationContext);
    }
}
复制代码

实现自定义的SpringApplicationRunListener

SpringApplicationRunListener接口中的方法都是定义为defualt

1364f5c5d5794630bdb7df4b3d6cb816_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

实现自定义的HalloSpringApplicationRunListener时不是必须要实现所有的方法

public class HalloSpringApplicationRunListener implements SpringApplicationRunListener {
    @Override
    public void starting(ConfigurableBootstrapContext bootstrapContext) {
        System.out.println(this.getClass().getSimpleName() + "启动了......");
    }
    @Override
    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
        String OSName = (String)environment.getSystemProperties().get("获取到的系统名称为:" + "os.name");
        System.out.println(this.getClass().getSimpleName() + "环境准备好了,获取到的系统名称为:" + OSName);
    }
    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println(this.getClass().getSimpleName() + "IOC容器准备好了.....");
    }
    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println(this.getClass().getSimpleName() + "容器加载完成.....");
    }
    @Override
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println(this.getClass().getSimpleName() + "容器启动完成,耗时:" + timeTaken);
    }
}
复制代码

实现自定义的ApplicationRunner

ApplicationRunner接口只只包含了一个run()方法

39f3320aff7f435e89319e75fc8c7668_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

自定义HalloApplicationRunner实现ApplicationRunner接口

public class HalloApplicationRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(this.getClass().getSimpleName() + "运行ing....");
    }
}
复制代码

实现自定义的CommandLineRunner

CommandLineRunner接口中只有一个run()方法

db0ad1c2fee54dedb0e330948815abce_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

自定义HalloCommandLineRunner类实现CommandLineRunner

public class HalloCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println(this.getClass().getSimpleName() + "运行ing,传入的参数为:" + Arrays.asList(args));
    }
}
复制代码

配置自定义组件

HalloCommandLineRunner和HalloApplicationRunner需要通过添加@Component注解注册到容器中

HalloApplicationContextInitializer和HalloSpringApplicationRunListener 需要配置META-INF/spring.factories配置文件中,在resources目录下新建META-INF/spring.factories配置文件,而配置文件的具体内容可以参看源码中spring.factories中的配置

e4699618375f479886c6944815c71c92_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

# Initializers
org.springframework.context.ApplicationContextInitializer=\
com.lilith.listener.HalloApplicationContextInitializer
# Application Listeners
org.springframework.boot.SpringApplicationRunListener=\
com.lilith.listener.HalloSpringApplicationRunListener
复制代码

测试监听器是否生效

启动应用

62e37c8ac33942c78d7c9e20ba1a5033_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

控制台报错缺少一个有参构造器

HalloSpringApplicationRunListener中增加一个有参构造器,可以参考SpringApplicationRunListener的另一个实现类EventPublishingRunListener

image.png

public HalloSpringApplicationRunListener(SpringApplication application, String[] args) {
}
复制代码

再次启动应用

image.png

控制台打印出了监听器中输出的信息


相关文章
|
2天前
|
缓存 前端开发 Java
【框架】Spring 框架重点解析
【框架】Spring 框架重点解析
17 0
|
2天前
|
XML 安全 前端开发
Spring Security 重点解析(下)
Spring Security 重点解析
12 1
|
2天前
|
安全 NoSQL Java
Spring Security 重点解析(上)
Spring Security 重点解析
12 1
|
2天前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
14 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
2天前
|
Linux 调度 数据库
|
2天前
|
Linux API 调度
xenomai内核解析-xenomai实时线程创建流程
本文介绍了linux硬实时操作系统xenomai pthread_creta()接口的底层实现原理,解释了如何在双内核间创建和调度一个xenomai任务。本文是基于源代码的分析,提供了详细的流程和注释,同时给出了结论部分,方便读者快速了解核心内容。
20 0
xenomai内核解析-xenomai实时线程创建流程
|
2天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
57 0
|
2天前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
138 0
|
2天前
|
存储 JSON Java
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
48 2
|
2天前
|
前端开发 搜索推荐 Java
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革

推荐镜像

更多