写在前面的话:spring的监听事件模型应该是观察者模式。本人项目里的应用在process方法按日期同步某个库的数据,在方法最后publish一个event事件,这个事件用于后续同步过来的数据处理。事件处理采用了spring的监听模型.这样可以做到process方法与event可以异步分离执行。(注:这个事件模型缺省使用SyncTaskExecutor来执行listener的注册event,所有该listener注册的event事件为同步执行的)。
当然,spring的这个机制还有很多应用的场景,就不一一列举了。
ApplicationEvent
事件抽象类,里面只有一个构造函数和一个timestamp。
ApplicationListener
监听接口,里面只有一个onApplicationEvent方法。需要用户自己编写ApplicationListener的实现。
ApplicationContext
spring上下文,其publishEvent方法用于通知监听器(ApplicationListener的实现)注册event时间.
publishEvent
void publishEvent(ApplicationEvent event)
Notify all listeners registered with this application of an application event.
源码解读:
1.作为ApplicationContext的实现AbstractApplicationContext.java的成员变量applicationListeners,是一个ArrayList,保存了所有的ApplicationListener
2.利用ApplicationEventMulticaster接口里的方法来完成注册监听addApplicationListener,移除监听removeApplicationListener,removeAllListeners,以及通知监听注册事件event:multicastEvent(ApplicationEvent event);
上面说到的publishEvent方法即使用了multicastEvent方法
SimpleApplicationEventMultucaster作为ApplicationEventMulticaster的一个实现,提供了multicastEvent的实现代码,其实就是迭代所有的监听器,用SyncTaskExecutor同步执行listener的onApplicationEvent
public void multicastEvent(final ApplicationEvent event) {
for (Iterator it = getApplicationListeners().iterator(); it
final ApplicationListener listener = (ApplicationListener) it
getTaskExecutor().execute(new Runnable() {
listener.onApplicationEvent(event);
}
});
}
3.注意事项:自己编写ApplicationListener的实现时,要注意不同的监听器处理不同的事件(复写onApplicationEvent)。原因就是multicastEvent的执行原理。它是迭代执行所有的监听器onApplicationEvent
这里是ApplicationEventMulticaster的类分布图
abstract public class AbstractApplicationEventMulticaster implements ApplicationEventMulticaster(Code)(Java Doc)
public interface ApplicationEventMulticaster (Code)(Java Doc)
public class SimpleApplicationEventMulticaster extends
这里是ApplicationContext的类分布图
public class DefaultResourceLoader implements ResourceLoader(Code)(Java Doc)
public interface ResourceLoader (Code)(Java Doc)
abstract public class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext,DisposableBean(Code)(Java Doc)
public interface ConfigurableApplicationContext extends ApplicationContext,Lifecycle(Code)(Java Doc)
public interface DisposableBean (Code)(Java Doc)
public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry(Code)(Java Doc)
public interface BeanDefinitionRegistry (Code)(Java Doc)
abstract public class AbstractRefreshableApplicationContext extends
下面是spring自身的事件应用
1) ContextRefreshedEvent:当ApplicationContext初始化或者刷新时触发该事件。
2) ContextClosedEvent:当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
3) RequestHandleEvent:在Web应用中,当一个http请求(request)结束触发该事件。
4) ContestStartedEvent:当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
5) ContestStopedEvent:当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
相关推荐
spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听
Spring框架作为Java开发的核心,其事件监听机制是理解和利用Spring的关键要素之一。这种机制基于观察者模式,由事件(ApplicationEvent)、事件监听器(ApplicationListener)和事件广播器...
spring的Applicationcontext对事件的监听,在一个applicationContext范围内,实现类似MQ的效果
NULL 博文链接:https://hubowei1.iteye.com/blog/2327765
Spring事件监听机制
主要给大家介绍了关于Spring的事件监听机制的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Spring 集成 IBM MQ 监听配置,包括用户管理配置和一些基础配置信息
二、 使用 Spring 的器监听器 ContextLoaderListener o1. maven依赖pom.xml o2. 注册监听器 ContextLoaderListener o3. 指定 Spring 配置文件的位置 o4. 获取Spring容器对象 在 Web 项目中使用 Spring 框架,首先...
主要介绍了Spring boot通过HttpSessionListener监听器统计在线人数的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
Spring的ApplicationEvent事件和监听器的测试工程,演示了如何使用Spring中的事件和监听器内容。完整的maven工程,能够运行。
基于springboot的文件夹监听和遗漏文件自动获取功能以及springboot编译的直接可运行的bat文件
技术: 1. spring事件驱动(ApplicationEventPublisher) 2. 策略模式处理事件 目的: 1. 通过event,代码逻辑异步处理 2. 通过策略模式,构建具体监听实现 3. 解耦 4. 容错(降低代码块错误风险)
主要给大家介绍了关于Spring Boot应用事件监听的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
NULL 博文链接:https://gwzan.iteye.com/blog/2429872
Spring监听资料Spring监听资料
附件是在Spring Boot项目中使用CommandLineRunner接口 实现在服务启动后监控某个文件目录的文件变化FileAlterationListener
@Slf4j public class MyListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { log.info("web项目的启动{} 一开始就启动",sce....
主要介绍了使用Spring事件机制实现异步的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了spring boot之SpringApplication 事件监听,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
spring 监听器 源码阅读 事件驱动 publishEvent 欢迎下载