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
源码的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。