Spring源码 - 容器刷新#initMessageSource()

Spring源码 - 容器刷新#initMessageSource()

Spring版本:Spring 5.3.13-release


# 1、initMessageSource()初始化MessageSource做国际化消息处理

源码很简单,直接分析即可:

AbstractApplicationContext#initMessageSource()代码:

	/**
	 * 初始化 MessageSource, 如果当前容器中没有则使用父工厂的
	 *
	 * Initialize the MessageSource.
	 * Use parent's if none defined in this context.
	 */
	protected void initMessageSource() {
		// 获取 BeanFactory
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		// 如果容器中没有 BeanName 为 messageSource 的 Bean 实例
		if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
			// 从容器中获取 BeanName 为 messageSource 类型为 MessageSource 的 Bean 实例, 并将其赋值给当前容器内部的 MessageSource
			this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
			// Make MessageSource aware of parent MessageSource.
			// 判断父类是否不为空 && 当前对象的 messageSource 是 HierarchicalMessageSource 的实例
			if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
				// 将 messageSource 强制类型转换为 HierarchicalMessageSource 类型
				HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
				// 判断父 MessageSource 是否为空
				if (hms.getParentMessageSource() == null) {
					// Only set parent context as parent MessageSource if no parent MessageSource
					// registered already.
					// 将 HierarchicalMessageSource 的父 MessageSource 赋值为 getInternalParentMessageSource()
					hms.setParentMessageSource(getInternalParentMessageSource());
				}
			}
			if (logger.isTraceEnabled()) {
				logger.trace("Using MessageSource [" + this.messageSource + "]");
			}
		}
		else {
			// Use empty MessageSource to be able to accept getMessage calls.
			// 容器中不存在 BeanName 为 messageSource 的 Bean 实例
			// 手动创建一个 DelegatingMessageSource 实例, 用于接受 getMessage 方法调用。
			DelegatingMessageSource dms = new DelegatingMessageSource();
			// 添加父类 MessageSource
			dms.setParentMessageSource(getInternalParentMessageSource());
			// 将 手动创建的 DelegatingMessageSource 赋值给当前容器中的 messageSource
			this.messageSource = dms;
			// 以 messageSource 为 BeanNme 将 DelegatingMessageSource 类的实例注册到一级缓存 singletonObjects 中
			beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
			if (logger.isTraceEnabled()) {
				logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
			}
		}
	}

GitHub源码地址https://github.com/kapbc/kapcb-spring-source/tree/master/Spring-Framework-v5.3.13

备注:此文为笔者学习Spring源码的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值