SpringBoot——》监听器

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Kafka】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】

代码地址:https://gitee.com/xiaoxianwansui/springboot-event-listener.git

一、SpringBoot启动时监听器的设计

1、执行构造方法

构造方法中会加载所有声明在spring.factories中的监听器。
key为ApplicationListener的value
image.png

(1)加载的监听器

image.png
image.png

(2)监听器相关类

监听器都实现了 ApplicationEvent接口,都会监听 ApplicationEvent发布的相关的事件。ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。

ApplicationListener.png

2、执行run方法

(1)实例化监听器

通过getRunListeners方法来获取我们在spring.factories中定义的SpringApplicationRunListener类型的实例,也就是EventPublishingRunListener。

SpringApplicationRunListeners listeners = getRunListeners(args);

getRunListeners.png
image.png
image.png

(2)发布事件

listeners.starting();

image.png
starting.png

二、SpringBoot监听器

监听器监听事件说明
ClearCachesApplicationListenerContextRefreshedEvent当触发ContextRefreshedEvent事件会清空应用的缓存
ParentContextCloserApplicationListenerParentContextAvailableEvent触发ParentContextAvailableEvent事件会完成父容器关闭的监听器
CloudFoundryVcapEnvironmentPostProcessorApplicationPreparedEvent判断环境中是否存在VCAP_APPLICATION或者VCAP_SERVICES。如果有就添加Cloud Foundry的配置;没有就不执行任何操作。
FileEncodingApplicationListenerApplicationEnvironmentPreparedEvent文件编码的监听器
AnsiOutputApplicationListenerApplicationEnvironmentPreparedEvent根据 spring.output.ansi.enabled参数配置 AnsiOutput
ConfigFileApplicationListenerApplicationEnvironmentPreparedEvent
ApplicationPreparedEvent
完成相关属性文件的加载,application.properties,application.yml
DelegatingApplicationListenerApplicationEnvironmentPreparedEvent监听到事件后转发给环境变量 context.listener.classes指定的那些事件监听器
ClasspathLoggingApplicationListenerApplicationEnvironmentPreparedEvent
ApplicationFailedEvent
一个SmartApplicationListener,对环境就绪事件ApplicationEnvironmentPreparedEvent/应用失败事件ApplicationFailedEvent做出响应,往日志DEBUG级别输出TCCL(thread context class loader)的classpath。
LoggingApplicationListenerApplicationStartingEvent
ApplicationEnvironmentPreparedEvent
ApplicationPreparedEvent
ContextClosedEvent
ApplicationFailedEvent
配置 LoggingSystem。使用 logging.config环境变量指定的配置或者缺省配置
LiquibaseServiceLocatorApplicationListenerApplicationStartingEvent使用一个可以和Spring Boot可执行jar包配合工作的版本替换liquibase ServiceLocator
BackgroundPreinitializerApplicationStartingEvent
ApplicationReadyEvent
ApplicationFailedEvent
尽早触发一些耗时的初始化任务,使用一个后台线程

三、SpringBoot事件

SpringBoot中的所有的事件都是继承于 ApplicationEvent这个抽象类,在SpringBoot启动的时候会发布如下的相关事件,而这些事件其实都实现了 SpringApplicationContext接口。

事件说明
ApplicationStartingEvent容器启动的事件
ApplicationEnvironmentPreparedEvent应用处理环境变量相关的事件
ApplicationContextInitializedEvent容器初始化的事件
ApplicationPreparedEvent应用准备的事件
ApplicationFailedEvent应用启动出错的事件
ApplicationStartedEvent应用Started状态事件
ApplicationReadyEvent应用准备就绪的事件

四、自定义监听器和事件

1、自定义监听器 && 监听所有事件

(1)创建自定义监听器

ApplicationEvent:表示监听所有事件

package com.xiaoxian.eventlistener.listener;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

/*
 * @author      :xiaoixan
 * @date        :2023/04/12 9:56
 * @class       :MySpringApplicationListener
 * @description :自定义监听器
 *               1.实现 ApplicationListener接口,ApplicationEvent表示监听所有的事件
 *               2.把自定义的监听器添加到spring.factories文件中
 * @version     :1.0
 **/
public class MySpringApplicationListener
		implements ApplicationListener<ApplicationEvent> {
	@Override
	public void onApplicationEvent(ApplicationEvent event) {
		System.out.println("自定义监听器--->" + event);
	}
}

(2)在spring.factories中注册自定义的监听器

org.springframework.context.ApplicationListener=\
com.xiaoxian.eventlistener.listener.MySpringApplicationListener

image.png

(3)启动服务

启动服务,可以看到相关事件发布的时候,自定义的MySpringApplicationListener监听器被触发了。
image.png

2、自定义监听器 && 监听指定事件

(1)创建自定义监听器

ApplicationStartingEvent:表示监听指定的ApplicationStartingEvent事件

package com.xiaoxian.eventlistener.listener;

import org.springframework.boot.context.event.ApplicationStartingEvent;
import org.springframework.context.ApplicationListener;
/*
 * @author      :xiaoixan
 * @date        :2023/04/12 9:56
 * @class       :MySpringApplicationStartingListener
 * @description :自定义监听器
 *               1.实现 ApplicationListener接口,ApplicationStartingEvent表示监听指定的ApplicationStartingEvent事件
 *               2.把自定义的监听器添加到spring.factories文件中
 * @version     :1.0
 **/
public class MySpringApplicationStartingListener implements ApplicationListener<ApplicationStartingEvent> {
	@Override
	public void onApplicationEvent(ApplicationStartingEvent event) {
		System.out.println("MySpringApplicationStartingListener--->" + event);
	}
}

(2)在spring.factories中注册自定义的监听器

org.springframework.context.ApplicationListener=\
com.xiaoxian.eventlistener.listener.MySpringApplicationListener,\
com.xiaoxian.eventlistener.listener.MySpringApplicationStartingListener

image.png

(3)启动服务

启动服务,可以看到ApplicationStartingEvent事件发布的时候,自定义的MySpringApplicationStartingListener监听器被触发了。
image.png

3、自定义监听器 && 监听自定义事件

(1)创建自定义事件

继承ApplicationEvent

package com.xiaoxian.eventlistener.event;

import org.springframework.context.ApplicationEvent;

/*
 * @author      :xiaoixan
 * @date        :2023/04/12 9:56
 * @class       :MyEvent
 * @description :自定义事件
 * @version     :1.0
 **/
public class MyEvent extends ApplicationEvent {

    public MyEvent(Object source) {
        super(source);
    }
}

(2)创建自定义监听器

MyEvent:表示监听指定的MyEvent事件

package com.xiaoxian.eventlistener.listener;

import com.xiaoxian.eventlistener.event.MyEvent;
import org.springframework.context.ApplicationListener;

/*
 * @author      :xiaoixan
 * @date        :2023/04/12 9:56
 * @class       :MySpringApplicationListener
 * @description :自定义监听器,监听自定义事件
 *               1.实现 ApplicationListener接口,MyEvent表示监听MyEvent事件
 *               2.把自定义的监听器添加到spring.factories文件中
 * @version     :1.0
 **/
public class MyEventListener implements ApplicationListener<MyEvent> {
	@Override
	public void onApplicationEvent(MyEvent event) {
		System.out.println("MyEventListener --->自定义事件触发" + event);
		// 触发对应的事件后 业务处理
		new Thread(()->{
			// 业务....
		}).start();
	}
}

(3)在spring.factories中注册自定义的监听器

org.springframework.context.ApplicationListener=\
com.xiaoxian.eventlistener.listener.MySpringApplicationListener,\
com.xiaoxian.eventlistener.listener.MySpringApplicationStartingListener,\
com.xiaoxian.eventlistener.listener.MyEventListener

image.png

(4)发布自定义事件

package com.xiaoxian.eventlistener.controller;

import com.xiaoxian.eventlistener.event.MyEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/*
 * @author      :xiaoixan
 * @date        :2023/04/12 10:03
 * @class       :EventController
 * @description :发布事件
 * @version     :1.0
 **/
@RestController
public class EventController {

    @Autowired
    ApplicationContext context;

    @GetMapping("/hello")
    public String hello() {
        // 发布自定义事件
        context.publishEvent(new MyEvent(new Object()));
        return "hello";
    }
}

(5)启动服务,访问请求

启动服务访问请求,可以看到自定义的MyEvent事件发布的时候,自定义的MyEventListener监听器被触发了。
image.png
image.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot实现监听器的过程是通过定义监听器类并注册到Spring容器中来实现的。首先,我们需要创建一个监听器类来监听特定的事件。在SpringBoot中,我们可以通过实现ApplicationListener接口来创建监听器类。然后,我们可以在监听器类中重写onApplicationEvent方法,该方法会在监听到指定事件发生时被调用。 接下来,我们需要将监听器注册到Spring容器中。在SpringBoot中,我们可以通过在监听器类上添加@Component注解来将其注册为一个Bean。这样,Spring容器在启动时会自动扫描并注册这个监听器。 在注册监听器后,当指定的事件发生时,Spring容器会根据监听器的优先级顺序依次调用监听器的onApplicationEvent方法。在这个方法中,我们可以编写我们需要执行的逻辑。 总结起来,SpringBoot实现监听器的步骤如下: 1. 创建一个监听器类,并实现ApplicationListener接口。 2. 在监听器类中重写onApplicationEvent方法,编写监听到事件后的逻辑。 3. 在监听器类上添加@Component注解,将其注册为一个Bean。 4. 在SpringBoot启动时,Spring容器会自动扫描并注册这个监听器。 5. 当指定事件发生时,Spring容器会自动调用监听器的onApplicationEvent方法执行相应的逻辑。 引用参考资料: :《springboot中使用监听器》 :《SpringBoot实现拦截器、过滤器、监听器过程解析》 :《目前只有一个实现类EventPublishingRunListener,它把监听的过程过装成了SpringApplicationEvent事并通过内部属性广播出去,属性名为initialMulticaster,是ApplicationEventMulticaster接口的实现类 SimpleApplicstionEventMulticaster.广播出去的事件对象会被SpringApplication中的listeners属性进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值