导读
Spring-国际化信息01-基础知识
Spring-国际化信息02-MessageSource接口
Spring-国际化信息03-容器级的国际化信息资源
概述
spring定义了访问国际化信息的MessageSource接口,并提供了几个易用的实现类.
MessageSource接口方法
我们先看下源码,先来了解一下该接口的几个重要方法
StringgetMessage(Stringcode,Object[]args,StringdefaultMessage,Localelocalcode表示国际化资源中的属性名;args用于传递格式化串占位符所用的运行期参数;当在资源找不到对应属性名时,返回defaultMessage参数所指定的默认信息;locale表示本地化对象;StringgetMessage(Stringcode,Object[]args,LocalelocalthrowsNoSuchMessageException;与上面的方法类似,只不过在找不到资源中对应的属性名时,直接抛出NoSuchMessageException异常;StringgetMessage(MessageSourceResolvableresolvable,LocalelocalthrowsNoSuchMessageException;MessageSourceResolvable将属性名、参数数组以及默认信息封装起来,它的功能和第一个接口方法相同。
其中:
HierarchicalMessageSource接口添加了两个方法,建立父子层级的MessageSource结构,setParentMessageSource(MessageSourceparent)方法用于设置父MessageSource,而getParentMessageSource()方法用于返回父MessageSource。
HierarchicalMessageSource接口最重要的两个实现类是ResourceBundleMessageSource和ReloadableResourceBundleMessageSource。
它们基于Java的ResourceBundle基础类实现,允许仅通过资源名加载国际化资源。ReloadableResourceBundleMessageSource提供了定时刷新功能,允许在不重启系统的情况下,更新资源的信息。StaticMessageSource主要用于程序测试,它允许通过编程的方式提供国际化信息。DelegatingMessageSource是为方便操作父MessageSource而提供的代理类。
该实现类允许用户通过beanName指定一个资源名,或通过beanNames指定一组资源名.
实例
资源文件:
greeting.common=How are you {0}?,today is {1}
greeting.morning=Good Morning {0}! now is {1,time,short}
greeting.afternoon=Good Afternoon {0}! now is {1,date,long}
i18n/fmt_resource
测试类
启动Spring容器,并通过MessageSource访问配置的国际化资源
package com.xgj.ioc.i18n.messageSource;
import java.util.GregorianCalendar;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MessageSourceTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
'classpath:com/xgj/ioc/i18n/messageSource/beans.xml');
// 获取MessageSource的Bean
MessageSource messageSource = ctx.getBean('resource',
MessageSource.class);
// 动态参数
Object[] objs = { 'Xiaogongjiang', new GregorianCalendar().getTime() };
// 获取格式化的国际化信息
String msg1 = messageSource.getMessage('greeting.common', objs,
Locale.CHINESE);
String msg2 = messageSource.getMessage('greeting.morning', objs,
Locale.US);
String msg3 = messageSource.getMessage('greeting.afternoon', objs,
Locale.CHINESE);
System.out.println(msg1);
System.out.println(msg2);
System.out.println(msg3);
}
}
运行结果:
通过Spring我们无须再分别加载不同语言、不同国家/地区的本地化资源文件,仅仅通过资源名就可以加载整套的国际化资源文件。此外,我们无须显式使用MessageFormat操作国际化信息,仅通过MessageSource#getMessage()方法就可以完成操作了.
比较下和http://blocsdnet/yangshangwei/article/details/76946002#resourceboundle这里的区别。
该实现类比之于ResourceBundleMessageSource的唯一区别在于它可以定时刷新资源文件,以便在应用程序不重启的情况下感知资源文件的变化。很多生产系统都需要长时间持续运行,系统重启会给运行带来很大的负面影响。这时,通过该实现类就可以解决国际化信息更新的问题
实例
资源文件同上
i18n/fmt_resource
我们通过cacheSeconds属性让ReloadableResourceBundleMessageSource每5秒钟刷新一次资源文件。cacheSeconds默认值为-1表示永不刷新,此时,该实现类的功能就蜕化为ResourceBundleMessageSource的功能。
测试类:
package com.xgj.ioc.i18n.reloadableResourceBundleMessageSource;
import java.util.GregorianCalendar;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ReloadableResourceBundleMessageSourceTest {
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
'classpath:com/xgj/ioc/i18n/reloadableResourceBundleMessageSource/beans.xml');
MessageSource messageSource = ctx.getBean('resource',
MessageSource.class);
Object[] objects = { 'XiaoGongJiang', new GregorianCalendar().getTime() };
for (int i = 0; i < 2; i++) {
String msg = messageSource.getMessage('greeting.common', objects,
Locale.US);
System.out.println(msg + '
sleep 20S');
Thread.sleep(20000);
}
}
}
让程序睡眠20秒钟,在这期间,我们将fmt_resource_en_US.properties中的greetincommon改为
greeting.common=***How are you {0}?,today is {1}
运行结果:
两次输出的格式化信息分别对应更改前后的内容,也即本地化资源文件的调整被自动生效了
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点
有点尴尬1232022-11-26
你买该股的股票了吗?“总部基地建成后集中办公,有利于提高规模效应、速度效应、组合效应、协同效应和管理效应。”这么多“效应”哇,以后股价是不是会大涨哇?