【Spring注解】事件监听:ApplicationListener和@EventList。。。
SpringBoot的事件监听就⽤的是Spring的 没有变化
Spring的两种
的实现有两种⽅式:
实现ApplicationListener接⼝
加@EventListener
ApplicationListener⽤法
ApplicationListener通过监听容器中发布的⼀些事件,事件发⽣就会触发的回调,就完成了事件驱动开发
写⼀个
写⼀个监听某个事件
spring ioc注解实现ApplicationListener
把加⼊到容器中
只要容器中有相关事件发布,我们就能监听到这个事件
测试结果:
监听到的两个事件
发布事件
我们也可以⾃⼰发布事件
我们可以把事件理解为⼀个对象,它存储了当前发⽣的事情的过程。
事件的创建:
直接new ⼀个ApplicationEvent
写⼀个类继承ApplicationEvent
// 发布事件
applicationContext.publishEvent(new ApplicationEvent(new String("我发布的事件")){ });
@EventListener⽤法
在想监听事件的⽅法上加上@EventListener注解,注解中指定要监听哪种类型的事件然后在⽅法上写上参数,获得监听到的事件
看结果和实现ApplicationListener接⼝的结果是⼀样的
事件驱动的流程
事件管理器要做的事:
得到所有的
在有事件发布时,遍历 判断哪个对当前事件感兴趣即泛型匹配,就调⽤那个Spring源码分析原理
创建ioc容器,调⽤refresh()⽅法
第⼀步:多播器/派发器
创建⼀个默认的事件管理器:SimpleApplicationEventMulticaster
this.initApplicationEventMulticaster();
第⼆步:注册
由于Spring提供了两种,因此refresh()的时候有两个地⽅拿
实现了ApplicationListener接⼝的
从容器中拿到所有的,将他们都注册到事件管理器中
加@EventListener注解的
finishBeanFactoryInitialization(beanFactory)
第三步:发布事件 ⽅法回调
发布事件的时候,遍历所有的Listener 到类型匹配的,调⽤对应Listener的⽅法
不管是什么事件, 都是通过publishEvent()发布事件的流程是⼀样的,只是创建事件的位置不⼀样ContextRefreshedEvent 事件
this.finishRefresh();//ContextRefreshedEvent 事件在这⾥
⾃⼰发布事件(不是在refresh())
容器关闭事件(不是在refresh())
多播器:Spring的事件管理器
ApplicationEventMulticaster就是Spring的事件管理器
容器创建对象refresh() 中调⽤initApplicationEventMulticaster就是初始化EventMulticaster的initApplicationEventMulticaster() ⽅法:
* 先去容器中id=“applicationEventMulticaster”的
* 容器中没有就创建SimpleApplicationEventMulticaster
* 将创建好的加⼊到beanFactory
⾃定义事件管理器配置线程池的功能
在SimpleApplicationEventMulticaster中有两⾮常重要的域
Executor taskExecutor; 线程池可以异步处理事件
也就是通过我们这个线程池来执⾏监听到事件的回调,就不影响主线程了
ErrorHandler errorHandler; 错误处理器 对于事件中事件错可以做相对应的处理。
我们可以⾃⼰⾃定义⼀个SimpleApplicationEventMulticaster加⼊到容器中(BeanName必须为applicationEventMulticaster), 就可以将这两个⾃定义添加进去。
@Bean("applicationEventMulticaster")//因为初始化事件处理器的时候只会通过名字,所以这⾥必须指定这个名字
public SimpleApplicationEventMulticaster simpleApplicationEventMulticaster(BeanFactory beanFactory,ThreadPoolTaskExecutor poolTaskExecutor){
SimpleApplicationEventMulticaster simpleApplicationEventMulticaster
=new SimpleApplicationEventMulticaster(beanFactory);
//配置线程池
simpleApplicationEventMulticaster.setTaskExecutor(poolTaskExecutor);
/
/ 配置错误处理器
simpleApplicationEventMulticaster.setErrorHandler(new ErrorHandler(){
@Override
public void handleError(Throwable throwable){
System.out.println("这⾥有错误了是:"+throwable);
}
});
return simpleApplicationEventMulticaster;
}
//线程池的配置
@Bean
public ThreadPoolTaskExecutor poolTaskExecutor(){
ThreadPoolTaskExecutor threadPoolTaskExecutor =new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setMaxPoolSize(15);
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setQueueCapacity(30);
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
注册
实现了ApplicationListener接⼝的
容器创建对象refresh() 中调⽤ApplicationListener()就是注册实现了ApplicationListener接⼝的的ApplicationListener()⽅法:
就是从容器中拿到所有的,把他们注册到ApplicationEventMulticaster中
标了@EventListener注解的
原理是:⽤EventListenerMethodProcessor处理器来解析⽅法上的@EventListener注解
public class EventListenerMethodProcessor implements SmartInitializingSingleton, ApplicationContextAware, BeanFactoryPostProcessor
EventListenerMethodProcessor实现了SmartInitializingSingleton接⼝,这个接⼝如下:
有⼀个afterSingletonsInstantiated⽅法:
这个⽅法在所有单实例bean全部创建完成后 执⾏
在EventListenerMethodProcessor的afterSingletonsInstantiated⽅法处打⼀个断点,看运⾏流程如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。