推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
SpringBoot——》监听器
代码地址:https://gitee.com/xiaoxianwansui/springboot-event-listener.git
一、SpringBoot启动时监听器的设计
1、执行构造方法
构造方法中会加载所有声明在spring.factories中的监听器。
key为ApplicationListener的value
(1)加载的监听器
(2)监听器相关类
监听器都实现了 ApplicationEvent
接口,都会监听 ApplicationEvent
发布的相关的事件。ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。
2、执行run方法
(1)实例化监听器
通过getRunListeners方法来获取我们在spring.factories中定义的SpringApplicationRunListener类型的实例,也就是EventPublishingRunListener。
SpringApplicationRunListeners listeners = getRunListeners(args);
(2)发布事件
listeners.starting();
二、SpringBoot监听器
监听器 | 监听事件 | 说明 |
---|---|---|
ClearCachesApplicationListener | ContextRefreshedEvent | 当触发ContextRefreshedEvent事件会清空应用的缓存 |
ParentContextCloserApplicationListener | ParentContextAvailableEvent | 触发ParentContextAvailableEvent事件会完成父容器关闭的监听器 |
CloudFoundryVcapEnvironmentPostProcessor | ApplicationPreparedEvent | 判断环境中是否存在VCAP_APPLICATION或者VCAP_SERVICES。如果有就添加Cloud Foundry的配置;没有就不执行任何操作。 |
FileEncodingApplicationListener | ApplicationEnvironmentPreparedEvent | 文件编码的监听器 |
AnsiOutputApplicationListener | ApplicationEnvironmentPreparedEvent | 根据 spring.output.ansi.enabled 参数配置 AnsiOutput |
ConfigFileApplicationListener | ApplicationEnvironmentPreparedEvent ApplicationPreparedEvent | 完成相关属性文件的加载,application.properties,application.yml |
DelegatingApplicationListener | ApplicationEnvironmentPreparedEvent | 监听到事件后转发给环境变量 context.listener.classes 指定的那些事件监听器 |
ClasspathLoggingApplicationListener | ApplicationEnvironmentPreparedEvent ApplicationFailedEvent | 一个SmartApplicationListener,对环境就绪事件ApplicationEnvironmentPreparedEvent/应用失败事件ApplicationFailedEvent做出响应,往日志DEBUG级别输出TCCL(thread context class loader)的classpath。 |
LoggingApplicationListener | ApplicationStartingEvent ApplicationEnvironmentPreparedEvent ApplicationPreparedEvent ContextClosedEvent ApplicationFailedEvent | 配置 LoggingSystem 。使用 logging.config 环境变量指定的配置或者缺省配置 |
LiquibaseServiceLocatorApplicationListener | ApplicationStartingEvent | 使用一个可以和Spring Boot可执行jar包配合工作的版本替换liquibase ServiceLocator |
BackgroundPreinitializer | ApplicationStartingEvent 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
(3)启动服务
启动服务,可以看到相关事件发布的时候,自定义的MySpringApplicationListener监听器被触发了。
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
(3)启动服务
启动服务,可以看到ApplicationStartingEvent事件发布的时候,自定义的MySpringApplicationStartingListener监听器被触发了。
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
(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监听器被触发了。