Spring对国际化这一块支持还是蛮友好的,上手也是蛮简单,但是加载流程还是需要大家掌握的,不然会少定义一个资源文件会让你莫名其妙的出现一些bug。接下来主要分享一下关于这一块的基本知识。
MessageSource
public interface MessageSource {
@Nullable
String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
}
复制代码
顶层接口一共提供了三个获取信息的方法:
- 提供默认值
defaultMessage
参数,当根据code
无法从相应的ResourceBundle
中查询出数据时,会将defaultMessage
的值返回。 - 当根据
code
无法从相应的ResourceBundle
中查询出数据时,直接抛出NoSuchMessageException
异常。 - 通过自定义
MessageSourceResolvable
解析器去获取信息,MessageSourceResolvable
也就是封装了code
,args
,defaultMessage
三个参数,用法上并没有什么不同。只不过code参数为String[]
数组形式,通过遍历调用的方式去获取信息,只要其中一个code
能够获取到值,便直接返回。查询不出数据时且defaultMessage
为空时,直接抛出NoSuchMessageException
异常。
在获取对应信息时,里面还有些许流程,我下面将会结合例子来进行说明,得先熟悉下该接口的主要实现类。
从类图结构中可以看出,顶层接口MessageSource
下面有个抽象类AbstractMessageSource
,三个基本实现类ResourceBundleMessageSource
,ReloadableResourceBundleMessageSource
,StaticMessageSource
。