zoukankan      html  css  js  c++  java
  • Spring监听器机制

    Spring监听器机制:

    产生Spring事件的时候会默认使用SimpleApplicationEventMulticaster的multicastEvent来广播事件,遍历所有监听器:并使用监听器中的onApplicationEvent方法来进行事件的处理

    广播事件:把一个事件发送给所有的监听器,让每一个监听器都对该事件进行处理

    对发出的每一个事件都会遍历所有的监听器,然后使用监听器中的onApplicationEvent方法来进行事件的处理

     

    下面是其中一个监听器的例子

    listeners.starting();
    //产生一个事件,并广播给所有的监听器
    public void starting() {
            this.initialMulticaster.multicastEvent(new ApplicationStartingEvent(this.application, this.args));
        }
    
    public void multicastEvent(ApplicationEvent event) {
            this.multicastEvent(event, this.resolveDefaultEventType(event));
        }
    
    public void multicastEvent(ApplicationEvent event, @Nullable ResolvableType eventType) {
            ResolvableType type = eventType != null ? eventType : this.resolveDefaultEventType(event);
            Executor executor = this.getTaskExecutor();
            Iterator var5 = this.getApplicationListeners(event, type).iterator();
    
            while(var5.hasNext()) {
                ApplicationListener<?> listener = (ApplicationListener)var5.next();
                if (executor != null) {
                    executor.execute(() -> {
                        this.invokeListener(listener, event);
                    });
                } else {
                    this.invokeListener(listener, event);
                }
            }
    
        }
    
    protected void invokeListener(ApplicationListener<?> listener, ApplicationEvent event) {
            ErrorHandler errorHandler = this.getErrorHandler();
            if (errorHandler != null) {
                try {
                    this.doInvokeListener(listener, event);
                } catch (Throwable var5) {
                    errorHandler.handleError(var5);
                }
            } else {
                this.doInvokeListener(listener, event);
            }
    
        }
    
    private void doInvokeListener(ApplicationListener listener, ApplicationEvent event) {
            try {
                listener.onApplicationEvent(event);//开始处理事件
            } catch (ClassCastException var6) {
                String msg = var6.getMessage();
                if (msg != null && !this.matchesClassCastMessage(msg, event.getClass())) {
                    throw var6;
                }
    
                Log logger = LogFactory.getLog(this.getClass());
                if (logger.isTraceEnabled()) {
                    logger.trace("Non-matching event type for listener: " + listener, var6);
                }
            }
    
        }
    
    //处理事件
    public void onApplicationEvent(SpringApplicationEvent event) {
            if (!Boolean.getBoolean("spring.backgroundpreinitializer.ignore") && event instanceof ApplicationStartingEvent && this.multipleProcessors() && preinitializationStarted.compareAndSet(false, true)) {
                this.performPreinitialization();
            }
    
            if ((event instanceof ApplicationReadyEvent || event instanceof ApplicationFailedEvent) && preinitializationStarted.get()) {
                try {
                    preinitializationComplete.await();
                } catch (InterruptedException var3) {
                    Thread.currentThread().interrupt();
                }
            }
    
        }
  • 相关阅读:
    利用Oracle创建数据库
    安装Oracle 10g
    安装ArcGIS Engine 9.3
    安装ArcGIS Desktop 9.3
    绘制扇形效果线条小Bug解决
    MFC画线功能总结
    MFC消息映射机制以及画线功能实现
    truncate
    postgresql死锁处理
    python编程中的if __name__ == 'main': 的作用
  • 原文地址:https://www.cnblogs.com/hanabivvv/p/14604204.html
Copyright © 2011-2022 走看看