package com.zdc.sp.listener;
import java.util.EventListener;
import org.springframework.context.ApplicationEvent; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;
/** * ApplicationListener 监听器中发布的事件,事件驱动模型开发 * * public interface ApplicationListener<E extends ApplicationEvent> * 监听ApplicationEvent 及其下面的子事件 * * 步骤: * 1)、写一个监听器来监听某一个事件(ApplicationEvent及其子类) * 2)、把监听器加入到容器中; * 3)、只要容器中相关事件的发布,我们就能监听到这个事件 * ContextRefershedEvent:容器刷新完成(所有bean都完成创建)会发布这个事件; * ContextClosedEvent:关闭容器发布这个事件 * 4)、发布一个是事件: * applicationContext.publishEvent(); * 例子:applicationContext.publishEvent(new ApplicationEvent(new String("这是一个发布事件!")) {}); * 原理: * 1、ContextRefreshedEvent事件: * 1)、容器创建对象:fresh(); * 2)、finishRefresh();容器刷新完成; * 3)、publishEvent(new ContextRefreshdEvent(this)); * 事件发布流程: * 1)、获取事件的多播器(派发器):getApplicationEventMulticaster() * 2)、multicastEvent派发事件: * 3)、获取到所有的ApplicationListener; * for (final ApplicationListener<?> listener : getApplicationListeners(event,type)) * 1)、若有Executor,则可以支持使用Executor进行异步派发; * 2)否则,同步的方式直接执行listener方法;invokeListener(listener,event); * 拿到listener回调onApplicationEvent方法; * * 2、(事件的多播器(派发器)): * 1)、容器创建对象;refresh(); * 2)、initApplicationEventMulticaster();初始化ApplicationEventMulticaster; * 1、先去容器中找到有没有id = "applicationEventMulticaster" * 2、如果没有this.applicationEventMulicaster = new SimpleApplicationEventMulicaster(beanFactory) * 并且加入到容器中,我们就可以在其他组件要派发事件,自动注入这个applicationEventMulicaster; * 3、容器中有哪些监听器 * 1)容器的创建:refresh(); * 2)、registerListener(); * 从容器中拿到所有的监听器,把他们注册到applicationEventMulicaster中; * String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class,true,false) * //将listener注册到ApplicationEventMulicaster中 * getApplicationEventMulicaster().addApplicationListenerBean(listenerBeanName) * * * * * @author lenovo * */ @Configuration @ComponentScan("com.zdc.sp.listener") public class Myconfig {
}
package com.zdc.sp.listener;
import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component;
@Component public class MyApplicationListener implements ApplicationListener<ApplicationEvent>{
//当容器中发布此事件后,方法触发 @Override public void onApplicationEvent(ApplicationEvent event) { System.out.println("收到事件:"+event); }
package com.zdc.sp.listener;
import org.springframework.context.ApplicationEvent; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Myconfig.class); //applicationContext.close(); applicationContext.publishEvent(new ApplicationEvent(new String("这是一个发布事件!")) {}); } }
