zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    玩转web之javaScript(五)---js和jquery一些不可不知的方法(input篇)
    设计模式 外观模式 一键电影模式
    设计模式 适配器模式 以手机充电器为例
    高仿微信5.2.1主界面架构 包含消息通知
    Java进阶 创建和销毁对象
    sql语句中单引号嵌套问题
    Spark SQL UDF和UDAF示例
    Spark Parquet使用
    iptables只允许指定ip访问本机的指定端口
    Spark On YARN内存和CPU分配
  • 原文地址:https://www.cnblogs.com/question-sky/p/6826197.html
Copyright © 2011-2022 走看看