文章目录
前言
initMessageSource()的作用是初始化国际化文件直接看代码
protected void initMessageSource() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
----------1、MESSAGE_SOURCE_BEAN_NAME=messageSource;
----------这也是为什么@Bean(name = "messageSource") name一定要是messageSource的原因。
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
---------2、如果存在beanFactory中定义了beanDefinition为messageSource,
----------就把当前容器的messageSource设置为配置的。
this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
// Make MessageSource aware of parent MessageSource.
if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
if (hms.getParentMessageSource() == null) {
// Only set parent context as parent MessageSource if no parent MessageSource
// registered already.
hms.setParentMessageSource(getInternalParentMessageSource());
}
}
if (logger.isDebugEnabled()) {
logger.debug("Using MessageSource [" + this.messageSource + "]");
}
}
else {
// Use empty MessageSource to be able to accept getMessage calls.
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
this.messageSource = dms;
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
"': using default [" + this.messageSource + "]");
}
}
}
具体使用
1、新加两个配置文件message_en_US.properties和message_zh_CN.properties
message_en_US.properties内容如下:
user.name=zhangsan
message_zh_CN.properties内容如下
user.name=张三
2、配置类中添加@Bean(name=“message”)
@Configuration
-------basePackages为具体的扫描包路径。
@ComponentScan(basePackages = "xxx.xxx.xx")
public class MainConfig {
//在 MainConfig 中 声明 MessageSource , 记得名字一定要叫做 messageSource !
@Bean(name = "messageSource")
public MessageSource getMessageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setDefaultEncoding("UTF-8");
--------addBasenames添加的字符串为
--------message_en_US.properties和message_zh_CN.properties文件名前缀
messageSource.addBasenames("message");
return messageSource;
}
}
3、执行main方法
public class MainClass {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);
String ctxzhMessage = ctx.getMessage("user.name", null, null, Locale.CHINA);
String ctxenMessage = ctx.getMessage("user.name", null, null, Locale.US);
System.out.println("ctxzhMessage = "+ ctxzhMessage);
System.out.println("ctxenMessage = "+ ctxenMessage);
--------上面直接从ctx.getMessage(xxxx)和
--------下面获取了ctx.getBean(MessageSource.class)的结果是一样的。
MessageSource messageSource = ctx.getBean(MessageSource.class);
String zhMessage = messageSource.getMessage("user.name", null, null, Locale.CHINA);
String enMessage = messageSource.getMessage("user.name", null, null, Locale.US);
String defMessage = messageSource.getMessage("user.name", null, null, Locale.getDefault());
System.out.println("zhMessage = " + zhMessage);
System.out.println("enMessage = " + enMessage);
System.out.println("defMessage = " + defMessage);
ctx.close();
}
}
上面的执行结果如下
ctxzhMessage = 张三
ctxenMessage = zhangsan
zhMessage = 张三
enMessage = zhangsan
defMessage = 张三