Spring源码情操陶冶-AbstractApplicationContext#initMessageSource

承接前文Spring源码情操陶冶-AbstractApplicationContext#registerBeanPostProcessors
约定web.xml配置的contextClass为默认值XmlWebApplicationContext

瞧瞧官方注释

    /**
     * Initialize the MessageSource.
     * Use parent's if none defined in this context.
     */

初始化MessageSource消息源,如果beanFactory不存在此bean则采用默认的配置并设置父类MessageSource

直接源码

protected void initMessageSource() {
        //获取bean工厂,此处一般为DefaultListableBeanFactory
        ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        //首先判断是否已有xml文件定义了id为messageSource的bean对象
        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的实现类
                HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
                //设置父类MessageSource,此处设置内部的parent messageSource
                if (hms.getParentMessageSource() == null) {
        hms.setParentMessageSource(getInternalParentMessageSource());
                }
            }
            if (logger.isDebugEnabled()) {
                logger.debug("Using MessageSource [" + this.messageSource + "]");
            }
        }
        else {
            // 则设置默认的DelegatingMessageSource 作为messageSource bean
            DelegatingMessageSource dms = new DelegatingMessageSource();
            dms.setParentMessageSource(getInternalParentMessageSource());
            this.messageSource = dms;
            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 + "]");
            }
        }
    }

小结

  1. 初始化资源配置,如果id为messgeSource的bean在spring xml文件中已配置,则需要注意其class属性为MessageSource的实现类;反之则默认设置DelegatingMessageSource单例资源配置类
  2. 如果指定的messageSource类也为HierarchicalMessageSource的实现类则对其设置父类messageSource
  3. 此处只涉及到初始化,具体的用途后续补充

下节预告

Spring源码情操陶冶-AbstractApplicationContext#initApplicationEventMulticaster

转载于:https://www.cnblogs.com/question-sky/p/6826197.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值