...
|
...
|
@@ -15,7 +15,27 @@ yohobuy事件及系统监控机制的实现逻辑 |
|
|
#### 初始化:
|
|
|
|
|
|
在容器启动的时候,AbstractApplicationContext会首先找有没有用户配置的事件广播器ApplicationEventMulticaster,\n
|
|
|
如果有则加载进来,没有则加载默认的事件广播器SimpleApplicationEventMulticaster。
|
|
|
如果有则加载进来,没有则new一个事件广播器SimpleApplicationEventMulticaster。具体代码如下:
|
|
|
```java
|
|
|
protected void initApplicationEventMulticaster() {
|
|
|
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
|
|
|
if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
|
|
|
this.applicationEventMulticaster =
|
|
|
beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
|
|
|
if (logger.isDebugEnabled()) {
|
|
|
logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
|
|
|
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
|
|
|
if (logger.isDebugEnabled()) {
|
|
|
logger.debug("Unable to locate ApplicationEventMulticaster with name '" +
|
|
|
APPLICATION_EVENT_MULTICASTER_BEAN_NAME +
|
|
|
"': using default [" + this.applicationEventMulticaster + "]");
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
然后spring会通过反射机制将所有实现了事件监听器接口ApplicationListener的bean注册到事件广播器的监听器注册表中。
|
|
|
|
|
|
#### 事件发布和处理:
|
...
|
...
|
@@ -23,8 +43,46 @@ yohobuy事件及系统监控机制的实现逻辑 |
|
|
只要是实现了ApplicationEventPublisherAware接口的bean,spring会将事件发布者实际就是ApplicationContext设置到该bean中。
|
|
|
要发布事件就调用ApplicationEventPublisher的publishEvent方法,在该方法中spring会委托事件广播器发布事件。
|
|
|
事件广播器会遍历注册的每个监听器,并启动来调用每个监听器的onApplicationEvent方法进行事件的处理。
|
|
|
由于默认事件广播器SimpleApplicationEventMulticaster的taskExecutor的实现类是SyncTaskExecutor,因此,事件监听器对事件的处理,是同步进行的。
|
|
|
要等所有监听器处理完事件才能返回。如果想用异步的,可以自己实现ApplicationEventMulticaster接口,并在Spring容器中注册id为 **applicationEventMulticaster** 的Bean。
|
|
|
由于spring自动new的事件广播器SimpleApplicationEventMulticaster的taskExecutor为null,因此,事件监听器对事件的处理,是同步进行的。
|
|
|
要等所有监听器处理完事件才能返回。
|
|
|
```java
|
|
|
@Override
|
|
|
public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {
|
|
|
ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
|
|
|
for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
|
|
|
Executor executor = getTaskExecutor();
|
|
|
if (executor != null) {
|
|
|
executor.execute(new Runnable() {
|
|
|
@Override
|
|
|
public void run() {
|
|
|
invokeListener(listener, event);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
else {
|
|
|
invokeListener(listener, event);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
|
protected void invokeListener(ApplicationListener listener, ApplicationEvent event) {
|
|
|
ErrorHandler errorHandler = getErrorHandler();
|
|
|
if (errorHandler != null) {
|
|
|
try {
|
|
|
listener.onApplicationEvent(event);
|
|
|
}
|
|
|
catch (Throwable err) {
|
|
|
errorHandler.handleError(err);
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
listener.onApplicationEvent(event);
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
如果想用异步的,可以自己实现ApplicationEventMulticaster接口,并在Spring容器中注册id为 **applicationEventMulticaster** 的Bean。
|
|
|
Spring发布一个事件之后,所有注册的事件监听器,都会收到该事件,因此,事件监听器在处理事件时,需要先判断该事件是否是自己关心的。
|
|
|
|
|
|
### 2.yoho.core的实现
|
...
|
...
|
|