Spring ApplicationEvent事件机制源码分析
观察者模式
-
通用类图
-
简单实现
public interface Observer {
void update(Object message);
}
public class ConcreteObserver implements Observer{
@Override
public void update(Object message) {
System.out.println("receive msg: " + JSON.toJSONString(message));
}
}
public abstract class Observale {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
this.observers.add(observer);
}
public void notifyObservers(Object message) {
for (Observer observer : this.observers) {
observer.update(message);
}
}
}
public class ConcreteObservale extends Observale {
public void doSomething() {
super.notifyObservers("ConcreteObservale doSomething");
}
}
public class ObTest {
public static void main(String[] args) {
ConcreteObserver concreteObserver = new ConcreteObserver();
ConcreteObservale concreteObservale = new ConcreteObservale();
concreteObservale.addObserver(concreteObserver);
concreteObservale.doSomething();
}
}
ApplicationEvent分析
- 对spring applicationEvent 提炼为对应的观察者模式实现
public class ApplicationEvent {
private Object object ;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
public interface ApplicationListener {
void onApplicationEvent(ApplicationEvent applicationEvent);
}
public class Listener implements ApplicationListener{
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
System.out.println("receive msg: " + JSON.toJSONString(applicationEvent));
}
}
public class SimpleApplicationEventMulticaster {
private List<ApplicationListener> applicationListeners = new ArrayList<>();
public void addApplicationListener(ApplicationListener applicationListener) {
this.applicationListeners.add(applicationListener);
}
public void multicastEvent(ApplicationEvent applicationEvent) {
for (ApplicationListener applicationListener : this.applicationListeners) {
this.doInvokeListener(applicationListener, applicationEvent);
}
}
private void doInvokeListener(ApplicationListener applicationListener, ApplicationEvent applicationEvent) {
applicationListener.onApplicationEvent(applicationEvent);
}
}
public class ApplicationTest {
public static void main(String[] args) {
ApplicationListener listener = new Listener();
SimpleApplicationEventMulticaster simpleApplicationEventMulticaster = new SimpleApplicationEventMulticaster();
simpleApplicationEventMulticaster.addApplicationListener(listener);
ApplicationEvent applicationEvent = new ApplicationEvent();
applicationEvent.setObject("send msg");
simpleApplicationEventMulticaster.multicastEvent(applicationEvent);
}
}
SimpleApplicationEventMulticaster 是观察者模式中的Observale角色,具有管理Obsever(addApplicationListener(ApplicationListener applicationListener))、通知Obsever(multicastEvent(ApplicationEvent applicationEvent))功能;
ApplicationListener 对应Obsever;
ApplicationEvent 为消息体。
- 源码分析
public class ApplicationTest {
public static void main(String[] args) {
//1 实例化Observer
ApplicationListener listener = new Listener();
//2 实例化Observable
SimpleApplicationEventMulticaster simpleApplicationEventMulticaster = new SimpleApplicationEventMulticaster();
//3 Observable 中 绑定 Observer
simpleApplicationEventMulticaster.addApplicationListener(listener);
//4 消息体
ApplicationEvent applicationEvent = new ApplicationEvent();
applicationEvent.setObject("send msg");
//5 通知 Observer
simpleApplicationEventMulticaster.multicastEvent(applicationEvent);
}
}
此为1中对应的测试代码,下面把spring中所做的步骤和这个测试代码一一对应。
initApplicationEventMulticaster(); 实例化多播器并放入singletonObjects中,相当于2步骤(实例化Observable)使其具有管理和通知Observer功能。
registerListeners();相当于1步骤和3步骤,Observable 注入被管理对象。
调用过程publishEvent(new ContextRefreshedEvent(this)); 对应5步骤