Spring 事件
2022-10-20 15:48:04 0 举报
AI智能生成
登录查看完整内容
Spring 事件
作者其他创作
大纲/内容
java.util.Observable
可观者对象(消息发送者)
java.util.Observer
观察者
观察者模式
java.util.EventObject
事件对象(事件传输对象)
java.util.EventListener
事件监听器
标准化接口
示例
Java 事件
EventListener
EventObject
Java 标准事件
ApplicationListener
Spring 事件监听器
ApplicationEvent
Spring 事件传输对象
ApplicationEventPublisher
Spring 事件发布器
ApplicationEventMulticaster
Spring 事件广播器
Spring 标准化事件
上下文关闭事件
ContextClosedEvent
上下文启动事件
ContextRefreshEvent
上下文启动完成事件
ContextStartedEvent
上下文停止事件
ContextStoppedEvent
Spring 内建的事件
通过 API 的方式实现
通过注解的方式
Spring 事件监听器使用
applicationContext.addApplicationListener(new MyListener());
通过ApplicationContext
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); applicationContext.register(MyListener.class);
通过register注册
注册SpringApplicationListener
通过 ApplicationEventPublisherAware 依赖注入
如何获取 ApplicationEventPublisher
applicationEventPublisher.publishEvent(new ApplicationEvent(\"Hello World\"){});
底层委托给事件广播器来推送事件
事件发布
依赖注入
依赖查找
获取方式
对 Listener 进行管理(增加和移除)
事件广播
具有功能
初始化流程图
源码分析
事件广播器初始化流程
同步模式下,需要等待监听器执行完业务,事件过长的情况下,可能会导致请求失败
同步模式
如 java.util.concurrent.ThreadPoolExecutor 异步模式下,无需等待
异步模式
通过 SimpleApplicationEventMulticaster#setTaskExecutor(java.util.concurrent.Executor) 进行模式切换
ApplicationEventMulticaster 没有提供同步和异步切换的功能,也没有提供相关的 API。只能通过强转为 SimpleApplicationEventMulticaster 并调用 setTaskExecutor 方法去切换同步和异步模式
存在的问题
API示例
注解示例
转换示例
同步与异步之间切换
同步和异步切换
存在多个 BeanFactory 存在层次性关系时,事件的推送会从先推送父类,再推送子类
定义
层次性消息推送示例
定位 Spring 事件源(ApplicationContext)进行过滤处理
解决方案:如果已经处理过就不处理,添加一个处理标识。但需要为 static 修饰,parentBeanFactory 和 currentBeanFactory 中都有实例
处理方案
在 publishEvent 方法处理的时候,会查询父类是否存在,如果存在,则先推送父类的事件。
产生的源码分析
Spring 层次性上下文事件传播
使用场景:简化 Spring 事件发送,关注事件源主体
发送方法:ApplicationEventPublisher#publishEvent(java.lang.Object)
PayloadApplicationEvent 本身允许扩展,但扩展的时候需要带上泛型,否则会报错
根据 java doc 描述,PayloadApplicationEvent 是内部使用的 API,但是,内部使用的地方缺很少
在 ApplicationEventPublisher#publishEvent(Object event); 方法中,底层会将 event 对象包装成 PayloadApplicationEvent 对象,没必要再去封装 PayloadApplicationEvent 对象。
注意事项
使用示例
Spring 4.2 Payload 事件
扩展 org.springframework.context.ApplicationEvent
实现 org.springframework.context.ApplicationListener
注册 org.springframework.context.ApplicationListener
自定义 Spring 事件
当一个类同时实现了 ApplicationEventPublisherAware、BeanPostProcessor 两个接口时,会导致事件发送时产生空指针问题
流程图及解决方案
Spring 3 存在的 bug
错误处理接口 - org.springframework.util.ErrorHandler
Spring 4.1 事件异常处理
Spring 按照指定类型发送事件
Listener 监听子类事件,父类发送则收不到消息,子类发送可以收到消息
Listener 监听父类事件,父类发送能收到消息,子类发送也能收到消息
解决方案:在事件监听时,监听的事件越具体越好,避免消息发送错乱。
层次性示例
ApplicationEvent 存在继承,消息发送问题
Spring 事件
收藏
0 条评论
回复 删除
下一页