配置文件
配置文件是基础,会影响执行逻辑,我们先来看下配置项:
-
basename:加载资源的文件名,可以多个资源名称,通过逗号隔开,默认是“messages”;
-
encoding:加载文件的字符集,默认是 UTF-8,这个不多说;
-
cacheDuration:文件加载到内存后缓存时间,默认单位是秒。如果没有设置,只会加载一次缓存,不会自动更新。这个参数在 ResourceBundleMessageSource、ReloadableResourceBundleMessageSource 稍微有些差异,会具体说下。
-
fallbackToSystemLocale:这是一个兜底开关。默认情况下,如果在指定语言中找不到对应的值,会从 basename 参数(默认是 messages.properties)中查找,如果再找不到可能直接返回或抛错。该参数设置为 true 的话,还会再走一步兜底逻辑,从当前系统语言对应配置文件中查找。该参数默认是 true;
-
alwaysUseMessageFormat:MessageSource 组件通过
MessageFormat.format
函数对国际化信息格式化,如果注入参数,输出结果是经过格式化的。比如MessageFormat.format("Hello, {0}!", "Kanshan")
输出结果是“Hello, Kanshan!”。该参数控制的是,当输入参数为空时,是否还是使用MessageFormat.format
函数对结果进行格式化,默认是 false; -
useCodeAsDefaultMessage:当没有找到对应信息的时候,是否返回 code。也就是当找了所有能找的配置文件后,还是没有找到对应的信息,是否直接返回 code 值。默认是 false,即不返回 code,抛出
NoSuchMessageException
异常。
这些配置参数都有各自的默认值。如果没有特殊的需求,可以直接直接按照默认约定使用。
执行逻辑
接下来我们看下流程图,下面的流程图绿色部分是 cacheDuration 没有配置的情况。对于 ResourceBundleMessageSource 是只加载一次配置文件,ReloadableResourceBundleMessageSource 会根据文件修改时间判断是否需要重新加载。
ResourceBundleMessageSource 的流程图
ReloadableResourceBundleMessageSource 的流程图
AbstractMessageSource 的几个 getMessage 方法源码
@Override
public final String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale) {
String msg = getMessageInternal(co