ApplcationEvent以及Listtener 是Spring 为我们提供的一个事件监听、订阅的实现,内部实现的原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高系统可扩展性以及可维护性。在一些与业务无关的、通用的操作方法,我们可以把它设计成事件监听器,事件发布者不需要考虑谁去监听、监听的具体内容是什么,发布者的工作只是为了发布事件而已。
在Spring Boot启动过程中,每个不同的启动阶段会分别广播不同的内置生命周期事件,然后相应的监听器会监听这些事件来执行一些初始化逻辑工作比如ConfigFileApplicationListener
会监听onApplicationEnvironmentPreparedEvent
事件来加载配置文件application.properties
的环境变量等。
发布顺序 | 事件 | 说明 |
---|---|---|
1 | ApplicationStartingEvent | 框架启动事件 |
2 | ApplicationEnvironmentPreparedEvent | 环境准备完毕事件 |
3 | ApplicationContextInitializedEvent | 上下文初始化 |
4 | ApplicationPreparedEvent | 上下文创建完毕,但是Bean还没有加载完毕 |
5 | ApplicationStartedEvent | bean实例化完成,但是未调用Runners接口 |
6 | ApplicationReadyEvent | 在所有的命令行应用启动后发送此事件 |
7 | ApplicationFailedEvent | 在启动时异常发送事件 |
在这里只是简单的讲解如何使用ApplicationEvent以及使用Listen来完成业务逻辑的解耦,不涉及到复杂的数据交互,所有需要引入的依赖很少,项目Pom.xml配置文件如下:
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter</artifactid>
</dependency>
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
<scope>provided</scope>
</dependency>
事件源
首先要创建一个事件,监听都是围绕着事件来进行的。事件的代码很简单:
事件触发
事件发布是由ApplicationContext对象管控的,在事件发布之前需要注入 ApplicationContext对象,然后通过 publishEvent 方法完成事件发布。
事件处理程序
现在需要使用@component注解来声明该监听需要被Spring 注入管理,在用户注册监听实现方法上添加 @EventListener 注解,当有userRegisterEvent事件发布时候,监听程序会自动调用,然后根据方法内配置的事件完成监听