一、概念
事件源:事件的產生者,任何一個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 應用上下文處理。