一、概念
事件源:事件的产生者,任何一个EventObject都必须拥有一个事件源。
事件监听器注册表:组件或者框架的事件监听器不可能漂浮在空中,而必须有所依存。也就是说组件或者框架必须提供一个地方保存事件监听器,这便是事件监听器注册表。一个事件监听器注册到组件或者框架中,其实就是保存在事件监听器注册表中。当组件和框架中的事件源产生事件时,就会通知这些位于事件监听器注册表中监听器。
事件广播器:它是事件和事件监听器沟通的桥梁,负责把事件通知给事件监听器。
二、代码例子
事件源
public class SpringTestEvent extends ApplicationEvent {
private String message;
public SpringTestEvent(Object source,String message) {
super(source);
System.out.println("事件源=="+message);
this.message = message;
}
public String getMessage() {
return message;
}
}
事件广播器:操作时调用sendMsg(),就可以执行。
@Component
public class SpringTestBean implements ApplicationContextAware {
@Autowired
ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void sendMsg(){
String msg ="455668666";
System.out.println("======"+msg);
applicationContext.publishEvent(new SpringTestEvent(this ,msg));
}
}
事件监听器注册表:获取对应的监听器进行操作
@Component
public class SpringTestListener implements ApplicationListener<SpringTestEvent> {
@Override
public void onApplicationEvent(SpringTestEvent springTestEvent) {
System.out.println("事件监听者:===="+springTestEvent.getMessage());
}
}
三、代码逻辑
1、项目加载refresh()初始化bean容器,初始化应用上下文事件广播器、注册事件监听器、完成刷新并发布容器刷新事件。
2、初始化事件源 new SpringTestEvent(applicationContext ,msg)
3、使用ApplicationContext的方法publishEvent()进行事件广播.
4、 在AbstractApplicationContext获取 ApplicationEventMulticaster事件广播器
5、根据事件监听器注册表 遍历获取自定义的SpringTestListener,监听到事件源
核心:bean容器的初始化,ApplicationContext 应用上下文处理。