美文网首页
六、spring加载过程之refresh过程(5)spring事

六、spring加载过程之refresh过程(5)spring事

作者: 小班悟空 | 来源:发表于2019-04-03 15:32 被阅读0次

    日期:2019-04-03

    (7)initMessageSource

    ​ 对上下文的消息源进行初始化

    protected void initMessageSource() {
            ConfigurableListableBeanFactory beanFactory = getBeanFactory();
            // messageSource 包含单例的话,检测属性是否设置
            if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
                this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
                // Make MessageSource aware of parent MessageSource.
                if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
                    HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
                    // 父级消息源没有设置的,setParent
                    if (hms.getParentMessageSource() == null) {
                        // Only set parent context as parent MessageSource if no parent MessageSource
                        // registered already.
                        //如果没有父MessageSource,则仅将父上下文设置为父MessageSource
                        hms.setParentMessageSource(getInternalParentMessageSource());
                    }
                }
                if (logger.isDebugEnabled()) {
                    logger.debug("Using MessageSource [" + this.messageSource + "]");
                }
            }
            //不包含消息源,创建
            else {
                // Use empty MessageSource to be able to accept getMessage .calls
                DelegatingMessageSource dms = new DelegatingMessageSource();
                dms.setParentMessageSource(getInternalParentMessageSource());
                this.messageSource = dms;
                //注册 messageSource 单例
                beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
                if (logger.isDebugEnabled()) {
                    logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
                            "': using default [" + this.messageSource + "]");
                }
            }
        }
    

    (8)initMessageSource

    ​ 初始化ApplicationEventMulticaster。 如果在上下文中没有定义,则使用SimpleApplicationEventMulticaster。

    protected void initApplicationEventMulticaster() {
       ConfigurableListableBeanFactory beanFactory = getBeanFactory();
       // APPLICATION_EVENT_MULTICASTER_BEAN_NAME = applicationEventMulticaster
       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 + "]");
          }
       }
    }
    

    (9)initApplicationEventMulticaster

    ​ 初始化上下文中的事件机制的容器

    protected void initApplicationEventMulticaster() {
       ConfigurableListableBeanFactory beanFactory = getBeanFactory();
       // APPLICATION_EVENT_MULTICASTER_BEAN_NAME = applicationEventMulticaster
       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 + "]");
          }
       }
    }
    

    (10)onRefresh

    ​ 初始化其他的特殊bean,需要用户重写。这里为空。

    protected void onRefresh() throws BeansException {
       // For subclasses: do nothing by default.
    }
    

    (11) registerListeners

    ​ 检查监听bean并且将这些bean向容器注册,比如Dubbo服务发布的过程就是在这个时候做的,利用事件发布机制,在listener.onApplicationEvent(event) 中发布暴露服务。

    protected void registerListeners() {
       // Register statically specified listeners first.
       for (ApplicationListener<?> listener : getApplicationListeners()) {
          getApplicationEventMulticaster().addApplicationListener(listener);
       }
    
       // Do not initialize FactoryBeans here: We need to leave all regular beans
       // uninitialized to let post-processors apply to them!
       String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
       for (String listenerBeanName : listenerBeanNames) {
          getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
       }
    
       // Publish early application events now that we finally have a multicaster...
       Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
       this.earlyApplicationEvents = null;
       if (earlyEventsToProcess != null) {
          for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
              //触发事件机制。多个事件同时触发。
             getApplicationEventMulticaster().multicastEvent(earlyEvent);
          }
       }
    }
    

    multicastEvent方法调用 multicastEvent(event, resolveDefaultEventType(event)),然后调用 invokeListener(listener, event),接着listener.onApplicationEvent(event); 触发事件。

    /**
    * SimpleApplicationEventMulticaster#multicastEvent(ApplicationEvent)
    */
    public void multicastEvent(ApplicationEvent event) {
       multicastEvent(event, resolveDefaultEventType(event));
    }
    
    
    @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);
                }
            }
        }
    
        
    protected void invokeListener(ApplicationListener<?> listener, ApplicationEvent event) {
            ErrorHandler errorHandler = getErrorHandler();
            //是否处理异常
            if (errorHandler != null) {
                try {
                    doInvokeListener(listener, event);
                }
                catch (Throwable err) {
                    errorHandler.handleError(err);
                }
            }
            else {
                doInvokeListener(listener, event);
            }
        }
    
    
    @SuppressWarnings({"unchecked", "rawtypes"})    
    private void doInvokeListener(ApplicationListener listener, ApplicationEvent event) {
            try {
                listener.onApplicationEvent(event);
            }
            catch (ClassCastException ex) {
                String msg = ex.getMessage();
                if (msg == null || matchesClassCastMessage(msg, event.getClass())) {
                    // Possibly a lambda-defined listener which we could not resolve the generic event type for
                    // -> let's suppress the exception and just log a debug message.
                    Log logger = LogFactory.getLog(getClass());
                    if (logger.isDebugEnabled()) {
                        logger.debug("Non-matching event type for listener: " + listener, ex);
                    }
                }
                else {
                    throw ex;
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:六、spring加载过程之refresh过程(5)spring事

          本文链接:https://www.haomeiwen.com/subject/vutzbqtx.html