Spring5源码 - 10 Spring事件监听机制_应用篇
程序员文章站
2022-07-12 11:23:54
...
Spring事件概览
Spring事件体系包括三个组件:事件,事件监听器,事件广播器
事件
Spring的内置事件中由系统内部进行发布,只需注入监听器
- ContextRefreshedEvent
当容器被实例化或refreshed时发布.如调用refresh()方法, 此处的实例化是指所有的bean都已被加载,后置处理器都被**,所有单例bean都已被实例化, 所有的容器对象都已准备好可使用. 如果容器支持热重载,则refresh可以被触发多次(XmlWebApplicatonContext支持热刷新,而 GenericApplicationContext则不支持)
- ContextStartedEvent
当容器启动时发布,即调用start()方法, 已启用意味着所有的Lifecycle bean都已显式接收到了start 信号
- ContextStoppedEvent
当容器停止时发布,即调用stop()方法, 即所有的Lifecycle bean都已显式接收到了stop信号 , 关闭的容器可以通过start()方法重启
- ContextClosedEvent
当容器关闭时发布,即调用close方法, 关闭意味着所有的单例bean都已被销毁.关闭的容器不能被重启或refresh
23岁的程序猿大爷都说了,让整个小demo , 那来吧
先贴个配置类
package com.artisan.eventlistener2;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.artisan.eventlistener2")
public class ArtisanConfig {
}
自定义事件
事件类需要继承ApplicationEvent
package com.artisan.eventlistener2;
import org.springframework.context.ApplicationEvent;
public class ArtisanEvent extends ApplicationEvent {
private String msg ;
public ArtisanEvent(Object source) {
super(source);
}
public ArtisanEvent(Object source,String msg) {
super(source);
this.msg = msg ;
}
public void print(){
System.out.println(msg);
}
}
作为测试,使用一个简单的pojo
- 自定义事件需要继承ApplicationEvent
- 因为
ApplicationEvent extends EventObject
,所以子类的构造方法需要调用super()
事件监听器
下面演示两种方式
基于接口
package com.artisan.eventlistener2;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class ArtisanListener implements ApplicationListener<ArtisanEvent> {
@Override
public void onApplicationEvent(ArtisanEvent event) {
System.out.println("实现ApplicationListener 监听到ArtisanEvent.....");
event.print();
}
}
- 事件监听器需要实现ApplicationListener接口,泛型接口,泛型类类型就是事件类型
- 其次需要是spring容器托管的bean,所以这里加了@component,重写onApplicationEvent方法
基于注解
package com.artisan.eventlistener2;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class ArtisanListenerByAnno {
@EventListener(ArtisanEvent.class)
public void onApplicationEvent(ArtisanEvent event) {
System.out.println("EventListener 监听到ArtisanEvent.....");
event.print();
}
}
- 方法上需要标注
@EventListener(ArtisanEvent.class)
,方法名任意 - 其次需要是spring容器托管的bean,所以这里加了@component
@EventListener,修饰在方法上,是不是比基于实现类的方式要好,不用一个事件一个类了,确实如此。
事件广播器
package com.artisan.eventlistener2;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ArtisanTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ArtisanConfig.class);
ac.publishEvent(new ArtisanEvent("xxxx","msg from artisanEvent"));
}
}
核心就是ac.publishEvent
ac.publishEvent(new ArtisanEvent("xxxx","msg from artisanEvent"));
【测试结果】
是不是发现,这不就是【观察者模式】吗? ----------确实确实,这就是观察者模式的典型应用,那spring是怎么实现的呢?
下篇我们继续分析Spring的源码实现