写在前面的话: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框架中,事件监听是一种实现模块间解耦的有效手段,它允许我们在应用程序的不同部分之间传递消息,而无需直接依赖。本篇文章将详细介绍Spring事件监听的三种方式:基于接口的监听器、基于类的监听器以及基于...
在Spring框架中,`ApplicationContext`不仅是一个容器,用于管理Bean的生命周期和依赖注入,它还提供了事件发布和监听的功能。这个特性使得Spring应用能够实现组件间的异步通信,类似于消息队列(MQ)的工作模式。...
Spring事件监听机制是Spring框架中的一个重要特性,它基于经典的观察者模式,允许应用程序组件之间进行松耦合的通信。在Spring中,事件监听机制由三部分组成:事件(ApplicationEvent)、事件监听器(Application...
Spring的事件监听机制示例详解 事件监听机制是Spring Framework中的一种机制,它允许应用程序在特定的事件发生时执行相应的操作。事件监听机制由事件发布者、事件监听者和事件广播者三个部分组成。在Spring中,事件...
在Spring框架中,事件监听机制是一种非常重要的组件间通信方式,它允许应用程序的不同部分通过发布和订阅事件来进行异步通信。这种模式使得组件之间松耦合,提高了代码的可维护性和可扩展性。下面我们将详细探讨...
在Spring框架中,事件监听是一种常见的模式,用于在应用程序中实现不同组件之间的解耦通信。这一机制使得系统可以在不直接依赖彼此的情况下,传递信息和触发响应。本文将深入探讨Spring中的事件监听机制,并通过源码...
本文将深入探讨如何实现Spring Boot的事件监听,包括发布事件、监听事件以及事件触发的过程。 首先,我们需要了解如何发布事件。在Spring框架中,事件是通过`ApplicationEvent`抽象类来表示的。为了发布自定义事件...
- 在Spring Boot应用中,我们可以创建一个`@Component`,并使用`@EventListener`注解来监听特定事件,或者自定义一个`ApplicationListener`监听`ApplicationReadyEvent`,在应用启动后开始监听文件夹。 - 使用`@...
在使用Spring事件机制实现异步的方法时,通常需要将事件监听器添加到ApplicationContext中。在上面的代码中,使用@SpringBootApplication的addListeners方法将MyListener添加到ApplicationContext中。 使用@Event...
总的来说,这个测试Demo帮助开发者理解并实践Spring的事件发布和监听机制,它是Spring容器内组件间通信的一种有效方式,尤其适用于那些不需要立即响应但需要在某个时刻被通知的情况。通过这个Demo,开发者可以学习...
在Spring boot中通过HttpSessionListener监听器统计在线人数是一种常见的技术实现方式,适用于需要跟踪和管理用户会话状态的Web应用程序。以下是从给定文件中提炼的关键知识点。 首先,了解HttpSessionListener接口...
Spring 集成 IBM MQ 监听配置,包括用户管理配置和一些基础配置信息
在Spring Boot中,监听器是用来响应特定事件的组件,例如Web应用程序的启动和关闭。`MyListener`类实现了`ServletContextListener`接口,这个接口有两个主要方法:`contextInitialized`和`contextDestroyed`。当Web...
在Spring Boot框架中,事件监听是一种重要的组件交互方式,它允许开发者在应用程序的不同部分之间传递信息,无需直接耦合。本文将深入探讨Spring Boot事件监听的源码实现,并通过一个案例示例来阐述其工作原理。 ...
Spring监听器及定时任务实现方法详解 在本文中,我们将详细介绍Spring监听器及定时任务实现方法的详解。通过示例代码,我们将展示如何使用Spring监听器和定时任务来实现批处理任务的执行。 Spring监听器 在Spring...
总结来说,Spring的事件管理提供了一种高效且灵活的方式来解耦组件间的通信,通过创建自定义事件、发布事件、监听并处理事件,可以实现复杂业务逻辑中的模块化。在实际开发中,结合`@Async`注解和事件上下文,可以...
此外,Spring还提供了`ContextRefreshedEvent`、`ApplicationStartedEvent`和`ApplicationStoppedEvent`等内置事件,用于监听应用程序的启动、刷新和关闭等生命周期事件。 在实际开发中,Spring事件可以用于模块间...
Spring Boot应用事件监听详解 Spring Boot应用事件监听是Spring Boot框架中的一种机制,用于监听应用程序的生命周期事件。这些事件可以帮助开发者在应用程序的不同阶段执行特定的操作,例如在应用程序启动时执行...
Spring事件主要涉及两个核心概念:事件发布(Event Publishing)和事件监听(Event Listening)。在这个"JAVA-spring学习资源之spring事件"中,我们将深入探讨这两个方面,并通过具体的示例来理解它们的工作原理。 ...