spring中的messageSource(国际化)
MessageSource介绍
messageSource是spring中的转换消息接口,提供了国际化信息的能力。MessageSource 用于解析消息,并支持消息的参数化和国际化。 Spring 包含两个内置的MessageSource 实现:ResourceBundleMessageSource 和ReloadableResourceBundleMessageSource 。
使用MessageSource做消息转换
配置类
@Configuration
public class MessageSourceConfig {
@Bean
public ResourceBundleMessageSource messageSource(){
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasenames("messages/message");
source.setDefaultEncoding("UTF-8");
return source;
}
}
资源文件
message_en.properties
test=test
stringMsg=I am {0}
message_zh.properties
test=测试
stringMsg=我是{0}
测试
@Component
@Slf4j
public class TestMessageSource {
@Autowired
private MessageSource messageSource;
public void testMessageSource(){
log.info("消息一:");
log.info(messageSource.getMessage("test", null,Locale.CHINESE));
log.info(messageSource.getMessage("test", null,Locale.ENGLISH));
log.info("消息二:");
log.info(messageSource.getMessage("stringMsg",new Object[]{"💊哥"},Locale.CHINESE));
log.info(messageSource.getMessage("stringMsg",new Object[]{"wenyao"},Locale.CHINESE));
}
}
结果
[INFO ] 消息一:
[INFO ] 测试
[INFO ] test
[INFO ] 消息二:
[INFO ] 我是💊哥
[INFO ] 我是wenyao
spring的AbstractApplicationContext中MessageSource初始化
初始化
在AbstractApplicationContext 中有一个refresh() 方法,在刷新方法里面调用一个initMessageSource() 。initMessageSource() 方法就是初始化上下文中的MessageSource资源国际化组件。
protected void initMessageSource() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
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 {
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 + "]");
}
}
}
使用容器中的messageSource
AbstractApplicationContext 提供了接口getMessage 方法来使用容器中的messagesource
@Override
public String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale) {
return getMessageSource().getMessage(code, args, defaultMessage, locale);
}
@Override
public String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException {
return getMessageSource().getMessage(code, args, locale);
}
@Override
public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
return getMessageSource().getMessage(resolvable, locale);
}
|