@[TOC](spring5.0 源码解析(day04) initMessageSource()😉
initMessageSource 使用
该方法主要 对上下文的消息来源进行初始化
- 我们先在项目中创建国际化文件
- 在配置类中增加如下配置
@Bean(name = "messageSource")
public MessageSource getMessageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setDefaultEncoding("UTF-8");
messageSource.addBasenames("message", "message_en");
return messageSource;
}
- 通过容器获取 messageSource
MessageSource messageSource = applicationContext.getBean(MessageSource.class);
String zhMessage = messageSource.getMessage("base.response.success.msg", null, null, Locale.CHINA);
String enMessage = messageSource.getMessage("base.response.fail.msg", null, null, Locale.ENGLISH);
System.out.println("zhMessage = " + zhMessage);
System.out.println("enMessage = " + enMessage);
- 启动项目打印结果
zhMessage = 成功
enMessage = fail
initMessageSource 解析
在 initMessageSource 方法中 我们可以看到,先检查beanFactory是否存在messageSource 的bean,不存在则初始化一个默认的messageSource 防止 getMessage 调用是出现问题
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// Bean 的名称必须要是 messageSource
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
// 让 MessageSource 知道父 MessageSource.
if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
if (hms.getParentMessageSource() == null) {
// 如果尚未注册父消息源,则仅将父上下文设置为父消息源。
// 已经注册.
hms.setParentMessageSource(getInternalParentMessageSource());
}
}
if (logger.isTraceEnabled()) {
logger.trace("Using MessageSource [" + this.messageSource + "]");
}
}
else {
// 使用空的 MessageSource 能够接受 getMessage 调用.
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
this.messageSource = dms;
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
if (logger.isTraceEnabled()) {
logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
}
}