码迷,mamicode.com
首页 > 移动开发 > 详细

Spring IOC 初始化刷新流程:initMessageSource()、initApplicationEventMulticaster()、onRefresh()、registerListeners()

时间:2020-12-11 12:17:24      阅读:13      评论:0      收藏:0      [点我收藏+]

标签:ica   collect   factor   getc   情况下   style   主题   extend   load   

Spring IOC 初始化刷新流程:https://www.cnblogs.com/jhxxb/p/13609289.html

 

方法源码

initMessageSource()

初始化消息源,向容器里注册一个事件源的单例 Bean:MessageSource

public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
    protected void initMessageSource() {
        ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        // 判断是否已经存在名为 “messageSource” 的 Bean 了(一般情况下是没有的)
        if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
            // 从容器里拿出这个 messageSource
            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;
                if (hms.getParentMessageSource() == null) {
                    // Only set parent context as parent MessageSource if no parent MessageSource registered already.
                    hms.setParentMessageSource(getInternalParentMessageSource());
                }
            }
            if (logger.isTraceEnabled()) {
                logger.trace("Using MessageSource [" + this.messageSource + "]");
            }
        } else {
            // Use empty MessageSource to be able to accept getMessage calls.
            DelegatingMessageSource dms = new DelegatingMessageSource();
            // 其实就是获取到父容器的 messageSource 字段(否则就是 getParent() 上下文自己)
            dms.setParentMessageSource(getInternalParentMessageSource());
            // 给当前的 messageSource 赋值
            this.messageSource = dms;
            // 把 messageSource 作为一个单例的 Bean 注册进 beanFactory 工厂里
            beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
            if (logger.isTraceEnabled()) {
                logger.trace("No ‘" + MESSAGE_SOURCE_BEAN_NAME + "‘ bean, using [" + this.messageSource + "]");
            }
        }
    }

 

initApplicationEventMulticaster()

初始化事件多播器:ApplicationEventMulticaster

public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
    protected void initApplicationEventMulticaster() {
        ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        // 若用户自己定义了这个 Bean(名称必须是 "applicationEventMulticaster"),就以用户的为准。
        // 否则注册一个系统默认的 SimpleApplicationEventMulticaster
        if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
            this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
            if (logger.isTraceEnabled()) {
                logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
            }
        } else {
            this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
            beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
            if (logger.isTraceEnabled()) {
                logger.trace("No ‘" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "‘ bean, using " + "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
            }
        }
    }

 

onRefresh()

public abstract class AbstractRefreshableWebApplicationContext extends AbstractRefreshableConfigApplicationContext implements ConfigurableWebApplicationContext, ThemeSource {
    @Override
    protected void onRefresh() {
        // 模版方法。本环境中的实现为:AbstractRefreshableWebApplicationContext#onRefresh 方法,Web 环境,所以去初始化了它的主题
        this.themeSource = UiApplicationContextUtils.initThemeSource(this);
    }

 

registerListeners()

上面已经把事件源、多播器都注册好了,这里就是注册监听器了

public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
    protected void registerListeners() {
        // Register statically specified listeners first.
        // 这一步和手动注册 BeanDefinitionRegistryPostProcessor 一样,可以自己通过 set 手动注册监听器,然后是最先执行的(此处我们没有自己set)
        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!
        // 取到容器里面的所有的监听器的名称,绑定到广播器,后面会广播出去这些事件
        // 注意:此处并没有说到 ApplicationListenerDetector
        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...
        // 这一步需要注意:如果存在早期应用事件,这里就直接发布了(同时就把 earlyApplicationEvents 字段置为 null)
        Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
        this.earlyApplicationEvents = null;
        if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
            for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
                getApplicationEventMulticaster().multicastEvent(earlyEvent);
            }
        }
    }

 

Spring IOC 初始化刷新流程:initMessageSource()、initApplicationEventMulticaster()、onRefresh()、registerListeners()

标签:ica   collect   factor   getc   情况下   style   主题   extend   load   

原文地址:https://www.cnblogs.com/jhxxb/p/13960012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!