在Spring框架中,initMessageSource 方法通常用于初始化应用程序的消息源(Message Source),它是负责解析和获取本地化消息(通常是国际化字符串)的组件。消息源是Spring国际化支持的核心部分,允许开发人员根据用户的语言环境提供不同的消息内容。
initMessageSource 方法通常会在Spring容器的初始化阶段被调用,用来配置和设置消息源。具体的实现和调用方式可能因Spring版本和应用程序的上下文配置而有所不同,但通常涉及以下步骤:
- 创建消息源对象:根据配置,创建一个消息源对象。这通常是一个实现了 org.springframework.context.MessageSource 接口的类,比如 ResourceBundleMessageSource。
- 设置基名:为消息源设置基名(basename),这通常是包含消息属性的资源文件的基础名称。Spring会根据这个基名和当前的语言环境来查找具体的资源文件。
- 设置缓存:配置消息源的缓存策略,以优化性能。通常,消息源会缓存已经加载的消息,以避免重复从资源文件中读取。
- 设置默认编码:设置默认的字符编码,用于处理从资源文件中读取的字符串。
- 其他配置:根据具体需求,可能还需要进行其他配置,比如设置父消息源(用于消息源的继承)或自定义消息格式等。
- 注册到容器中:将配置好的消息源注册到Spring容器中,这样其他组件就可以通过依赖注入或查找容器的方式来使用它。
在Spring Boot中,initMessageSource 方法通常会被自动配置所覆盖,开发人员只需要在 application.properties 或 application.yml 文件中配置相关的国际化属性,Spring Boot就会自动创建一个合适的消息源并注册到容器中。
protected void initMessageSource() {
//获取beanFactory
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
//判断容器中是否存在messageSource(xml中是否定义了messageSource)
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
//存在 则获取
this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
// Make MessageSource aware of parent MessageSource.
//如果当前容器存在父容器 并且messageSource的类型是HierarchicalMessageSource,则转成成 HierarchicalMessageSource
if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
//同时判断hms 是否有父级MessageSource 如果没有则设置父级messageSource
if (hms.getParentMessageSource() == null) {
// Only set parent context as parent MessageSource if no parent MessageSource
// registered already.
hms.setParentMessageSource(getInternalParentMessageSource());
}
}
if (logger.isTraceEnabled()) {
logger.trace("Using MessageSource [" + this.messageSource + "]");
}
}
else {
// Use empty MessageSource to be able to accept getMessage calls.
//如果容器中没有messageSource,则创建一个新的,并且设置父级messageSource
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
this.messageSource = dms;
//并且向容器中注册该messageSource
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
if (logger.isTraceEnabled()) {
logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
}
}
}