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的源码实现