Spring 通过MessageSource
接口(策略模式)实现的国际化,主要的实现有AbstractMessageSource
,ResourceBundleMessageSource
。
实质上,ResourceBundleMessageSource
底层是基于jdk的ResourceBundle
类实现的。
ResourceBundleMessageSource使用
- 必须要有一个
ResourceBundleMessageSource
,基于java的配置:
@Configuration
public class MyConfig {
@Bean
public MessageSource messageSource(){
ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();
resourceBundleMessageSource.addBasenames("i18n/messages");
resourceBundleMessageSource.addBasenames("exc");
resourceBundleMessageSource.setDefaultEncoding("utf-8");
return resourceBundleMessageSource;
}
}
classpath.png
以上配置设置了两个basename
(其实就是类路径的相对地址),Spring会到i18n
文件夹下寻找以messages
为开头的文件,我这里设置了三个文件,分别是messages.properties
,messages_en_US.properties
,message_zh_CN.properties
,其中en_US
,zh_CN
表示国际化,当表示不同地区时,会获取与地区相对应的内容。Spring还会再类路径下寻找以exc
为开头的属性文件。
注意:如果两个或多个
basename
中都包含相同的内容,比如messages.properties
和exc.properties
中都包含message=你好
,则Spring遵循谁先声明谁先被加载,不会覆盖。在上个案例中Spring会加载messages.properties
中的message
。
另外,如果你使用了spring-boot,spring-boot会基于自动配置自动注入一个ResourceBundleMessageSource
,前提是必须在application.properties
或application.yml
中配置spring.messages
。详情请查看MessageSourceAutoConfiguration
。
网友评论