前言
前两篇博客【观察者设计模式的演进】和【JDK观察者模式探究】深度讲了观察者模式的实现和作用,相信很多同学都知道SpringBoot是基于Spring Framework的一套东西做出来的。之所以SpringBoot能够做到非常简便的启动,很大一部分功劳应该属于Spring Framework中提供的Listener-Event功能。所以这篇博客就是要看下Spring的Listener-Event到底是有什么功能,以及它在SpringBoot的启动中扮演了什么角色。更多Spring内容进入【Spring解读系列目录】。
Spring Events
Spring当中的事件通过org.springframework.context.ApplicationEvent实例来表示。这个抽象类继承扩展了java.util.EventObject,通过使用EventObject中的getSource()方法,可以很容易地获得所发生的给定事件的对象。SpringBoot中事件大致有两种类型:
第一种:与ApplicationContext相关联
所有这种类型的事件都继承自org.springframework.context.event.ApplicationContextEvent类。凡是继承了ApplicationContextEvent类都可以被应用于由org.springframework.context.ApplicationContext引发的事件(简言之,就是那些构造函数传入的是ApplicationContext类型的参数)。通过这种方式就可以直接通过应用程序上下文的生命周期来得到所发生的事件。本质上来说SpringBoot一共有四个分支事件。
• ContextStartedEvent:在上下文启动时被启动。
• ContextStoppedEvent:当上下文停止时启动。
• ContextRefreshedEvent:当上下文被刷新时被启动。
• ContextClosedEvent:当上下文被关闭时被启动。

第二种:与request 请求相关联
由org.springframework.web.context.support.RequestHandledEvent实例来表示,当在ApplicationContext中处理请求时,这些实例就会被启动。
本篇将会主要对与ApplicationContext相关联的应用事件进行一个举例说明。
事件的定义
之前的例子里,我们举例开花这个事件,其实可以抽象出来作为一个事件类,所有Flower能够表示的行为都实现这个事件类。因为Flower不仅可以开花,还可以凋零,还可以生虫等等。而两个主人翁则对不同的事件有不同的反应。那么SpringBoot中就是对这些事件做了一个抽象,凡是事件都必须继承自ApplicationEvent。
public abstract class ApplicationEvent extends EventObject {
private static final long serialVersionUID = 7099057708183571937L;
private final long timestamp;
public ApplicationEvent(Object source) {
super(source);
this.timestamp = System.currentTimeMillis();
}
public final long getTimestamp() {
return this.timestamp;
}
}
从

本文围绕Spring的Listener - Event功能展开,介绍了Spring Events的两种类型,重点阐述与ApplicationContext相关联的事件。讲解了事件的定义,通过实例说明Spring Boot启动事件的应用,并在此基础上扩展出第五个事件。最后指出Spring Boot自动配置与事件处理的关系,还留下源码中观察者事件模型注入过程的疑问待后续讲解。
最低0.47元/天 解锁文章
3299

被折叠的 条评论
为什么被折叠?



