java中 事件 源代码_spring 事件模式 源代码导读

一,jdk 事件对象基类

package java.util;

import java.io.Serializable;

public class EventObject

implements Serializable

{

protected transient Object source;

public Object getSource()

{

return this.source;

}

public EventObject(Object paramObject)

{

if (paramObject == null)

throw new IllegalArgumentException("null source");

this.source = paramObject;

}

public String toString()

{

return getClass().getName() + "[source=" + this.source + "]";

}

}

2。spring事件基类

public abstract class ApplicationEvent extends EventObject {

/** use serialVersionUID from Spring 1.2 for interoperability */

private static final long serialVersionUID = 7099057708183571937L;

/** System time when the event happened */

private final long timestamp;

/**

* Create a new ApplicationEvent.

* @param source the component that published the event (never null)

*/

public ApplicationEvent(Object source) {

super(source);

this.timestamp = System.currentTimeMillis();

}

/**

* Return the system time in milliseconds when the event happened.

*/

public final long getTimestamp() {

return this.timestamp;

}

}

3,ApplicationContextEvent基类

public abstract class ApplicationContextEvent extends ApplicationEvent {

/**

* Create a new ContextStartedEvent.

* @param source the ApplicationContext that the event is raised for

* (must not be null)

*/

public ApplicationContextEvent(ApplicationContext source) {

super(source);

}

/**

* Get the ApplicationContext that the event was raised for.

*/

public final ApplicationContext getApplicationContext() {

return (ApplicationContext) getSource();

}

}

4。容器关闭事件

public class ContextClosedEvent extends ApplicationContextEvent {

/**

* Creates a new ContextClosedEvent.

* @param source the ApplicationContext that has been closed

* (must not be null)

*/

public ContextClosedEvent(ApplicationContext source) {

super(source);

}

}

5,AbstractApplicationContext中fireclose事件

public void publishEvent(ApplicationEvent event) {

Assert.notNull(event, "Event must not be null");

if (logger.isTraceEnabled()) {

logger.trace("Publishing event in " + getDisplayName() + ": " + event);

}

getApplicationEventMulticaster().multicastEvent(event);

if (this.parent != null) {

this.parent.publishEvent(event);

}

}

6,事件处理监听器控制器(SimpleApplicationEventMulticaster)

@SuppressWarnings("unchecked")

public void multicastEvent(final ApplicationEvent event) {

for (final ApplicationListener listener : getApplicationListeners(event)) {

Executor executor = getTaskExecutor();

if (executor != null) {

executor.execute(new Runnable() {

@SuppressWarnings("unchecked")

public void run() {

listener.onApplicationEvent(event);

}

});

}

else {

listener.onApplicationEvent(event);

}

}

}

7。AbstractApplicationEventMulticaster获取注冊close事件的监听器

protected Collection getApplicationListeners(ApplicationEvent event) {

Class extends ApplicationEvent> eventType = event.getClass();

Class sourceType = event.getSource().getClass();

ListenerCacheKey cacheKey = new ListenerCacheKey(eventType, sourceType);

ListenerRetriever retriever = this.retrieverCache.get(cacheKey);

if (retriever != null) {

return retriever.getApplicationListeners();

}

else {

retriever = new ListenerRetriever(true);

LinkedList allListeners = new LinkedList();

synchronized (this.defaultRetriever) {

for (ApplicationListener listener : this.defaultRetriever.applicationListeners) {

if (supportsEvent(listener, eventType, sourceType)) {

retriever.applicationListeners.add(listener);

allListeners.add(listener);

}

}

if (!this.defaultRetriever.applicationListenerBeans.isEmpty()) {

BeanFactory beanFactory = getBeanFactory();

for (String listenerBeanName : this.defaultRetriever.applicationListenerBeans) {

ApplicationListener listener = beanFactory.getBean(listenerBeanName, ApplicationListener.class);

if (!allListeners.contains(listener) && supportsEvent(listener, eventType, sourceType)) {

retriever.applicationListenerBeans.add(listenerBeanName);

allListeners.add(listener);

}

}

}

OrderComparator.sort(allListeners);

this.retrieverCache.put(cacheKey, retriever);

}

return allListeners;

}

}

二,

1,监听器基类

public interface EventListener

{

}

2,spring监听器基类

public interface ApplicationListener extends EventListener {

/**

* Handle an application event.

* @param event the event to respond to

*/

void onApplicationEvent(E event);

}

3。AbstractApplicationContext加入监听

public void addApplicationListener(ApplicationListener> listener) {

if (this.applicationEventMulticaster != null) {

this.applicationEventMulticaster.addApplicationListener(listener);

}

else {

this.applicationListeners.add(listener);

}

}

4,加入listenner到AbstractApplicationEventMulticaster

public void addApplicationListener(ApplicationListener listener) {

synchronized (this.defaultRetriever) {

this.defaultRetriever.applicationListeners.add(listener);

this.retrieverCache.clear();

}

}

5,监听处理类注冊入口AbstractApplicationContext

public Object postProcessAfterInitialization(Object bean, String beanName) {

if (bean instanceof ApplicationListener) {

// potentially not detected as a listener by getBeanNamesForType retrieval

Boolean flag = this.singletonNames.get(beanName);

if (Boolean.TRUE.equals(flag)) {

// singleton bean (top-level or inner): register on the fly

addApplicationListener((ApplicationListener>) bean);

}

else if (flag == null) {

if (logger.isWarnEnabled() && !containsBean(beanName)) {

// inner bean with other scope - can't reliably process events

logger.warn("Inner bean '" + beanName + "' implements ApplicationListener interface " +

"but is not reachable for event multicasting by its containing ApplicationContext " +

"because it does not have singleton scope. Only top-level listener beans are allowed " +

"to be of non-singleton scope.");

}

this.singletonNames.put(beanName, Boolean.FALSE);

}

}

return bean;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值