spring MessageSource

messageSource 在spring 中提供国际化的支持

ApplicationContext接口扩展了MessageSource接口,因而提供了消息处理的功能(i18n或者国际化)。与 HierarchicalMessageSource一起使用,它还能够处理嵌套的消息,这些是Spring提供的处理消息的基本接口。让我们快速浏览一 下它所定义的方法:

String getMessage(String code, Object[] args, String default, Locale loc):用来从MessageSource获取消息的基本方法。如果在指定的locale中没有找到消息,则使用默认的消息。args中的参数将使用标 准类库中的MessageFormat来作消息中替换值。

String getMessage(String code, Object[] args, Locale loc):本质上和上一个方法相同,其区别在:没有指定默认值,如果没找到消息,会抛出一个NoSuchMessageException异常。

String getMessage(MessageSourceResolvable resolvable, Locale locale):上面方法中所使用的属性都封装到一个MessageSourceResolvable实现中,而本方法可以指定 MessageSourceResolvable实现。
 

当一个ApplicationContext被加载时,它会自动在context中查找已定义为MessageSource类型的bean。此 bean的名称须为messageSource。如果找到,那么所有对上述方法的调用将被委托给该bean。否则ApplicationContext会 在其父类中查找是否含有同名的bean。如果有,就把它作为MessageSource。如果它最终没有找到任何的消息源,一个空的 StaticMessageSource将会被实例化,使它能够接受上述方法的调用。

protected void initMessageSource() {
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
			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 + "]");
			}
		}
	}

Spring目前提供了两个MessageSource的实现:ResourceBundleMessageSource和 StaticMessageSource。它们都继承NestingMessageSource以便能够处理嵌套的消息。 StaticMessageSource很少被使用,但能以编程的方式向消息源添加消息。ResourceBundleMessageSource会用得 更多一些,为此提供了一下示例:
com.liyixing.spring.properties包下面有
format_en_GB.properties文件
test.mesage = 123
test.mesage = 456

format_zh.properties文件
<beans>
  <bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>com.liyixing.spring.properties.format</value>
</list>
</property>
</bean>
</beans>
String a = context.getMessage("test.mesage", null, "Default", null);
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "beans.xml", "beans1.xml" });
IAccount accountService = (IAccount) context.getBean("accountService");
IDownload download = (IDownload) context.getBean("downloadService");
Account account = (Account) context.getBean("account");
String a = context.getMessage("test.mesage", null, "Default",
new Locale("en", "GB"));

String b = context.getMessage("test.mesage", null, "Default",
new Locale("zh"));

猜你喜欢

转载自xuyunti.iteye.com/blog/2247115