一起学SF框架系列4.7-spring-context-国际化(I18N)MessageResource

Spring通过MessageSource接口提供国际化功能,主要涉及ResourceBundleMessageSource和ReloadableResourceBundleMessageSource两个类。ReloadableResourceBundleMessageSource支持更多特性,如从不同资源位置加载,读取XML属性文件,配置默认编码和热重载。配置MessageSourcebean并在应用中通过@Autowired注解或XML配置使用,根据Locale选择相应语言的消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring通过MessageSource接口提供了国际化(“i18n”)功能。搞明白MessageResource相关接口和类,基本就掌握了国际化功能。

MessageSource接口

定义了消息访问接口。
String getMessage(String code,Object[]args,String default,Locale loc):核心方法,用于从MessageSource检索消息的基本方法(参数说明:code-消息代码;args-消息用到替换值,从{0}对应第一个参数,以此类推;default-消息找不到代替的默认消息;loc-国际化编码)。如果找不到指定区域设置的消息,则使用默认消息。使用标准库提供的MessageFormat功能,传入的任何参数都将成为替换值。
String getMessage(String code,Object[]args,Locale loc):本质上与前面的方法相同,但有一个区别:不能指定默认消息。如果找不到消息,则会引发NoSuchMessageException。
String getMessage(MessageSourceResolvable resolvable,Locale Locale):前面方法中使用的所有属性也封装在一个名为MessageSourceResolvable的类中,您可以将该类与此方法一起使用。

类关系

在这里插入图片描述

从图上看,虽然国际化功能比较简单,但Spring的设计和实现还是有点复杂。从使用来说我们只需关注ResourceBundleMessageSource和ReloadableResourceBundleMessage。后者可以看做是前者的增强版,具体区别如下:
1、ResourceBundleMessageSource只是从类路径加载资源文件,ReloadableResourceBundleMessage可从任何资源位置读取文件。
2、ResourceBundleMessageSource限于读取.properties文件,ReloadableResourceBundleMessage还可以读取xml属性文件。
3、ResourceBundleMessageSource不支持配置默认编码(自身默认为““ISO-8859-1””),ReloadableResourceBundleMessage支持。
4、ResourceBundleMessageSource不支持对bundle属性文件的热重新加载,ReloadableResourceBundleMessage支持。

使用

配置

定义消息bean。

	<!-- bean名称必须是 messageSource -->
	<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  	 	<property name="defaultEncoding" value ="UTF-8" />
		<!-- 消息文件名 -->
		<property name="basenames" >
			<list>
				<!-- 消息文件名,后缀通常是.properties; i18n国际化的文件名格式:文件名_语言编码 为对应语言的配置文件-->
				<value>i18n_info</value>
				<value>i18n_error</value>
			</list>
		</property>
	</bean>

注:
1、因为Spring的MessageSource基于Java的ResourceBundle,所以它不会合并具有相同基本名称的bundle,而是只使用找到的第一个bundle。具有相同基本名称的后续消息束将被忽略。
2、国际化地区语言码对照表(i18n)https://blog.youkuaiyun.com/fujianxinghuo/article/details/126504621
3、对应上面配置的消息文件示例:
在这里插入图片描述

框架加载

ApplicationContext容器刷新时,会自动搜索上下文中定义的MessageSource bean。bean的名称必须为messageSource。如果找到这样的bean,则对前面方法的所有调用都将委托给消息源。如果找不到消息源,ApplicationContext将尝试查找包含同名bean的父级,如果存在则作为MessageSource。如果ApplicationContext找不到任何消息源,则会实例化一个空的DelegatingMessageSource,以便能够接受对上面定义的方法的调用。

应用使用

1、用@Autowired注入到bean属性

@Component
public class DemoMessageSource extends BaseDemo{
	@Autowired
	MessageSource ms;
	
	public void demo() {
		super.demo();
		// 使用英语		
		System.out.println("from message_info:"+ms.getMessage("demo.title", null, null,Locale.ENGLISH));
		System.out.println("from message_error:"+ms.getMessage("error.except", null, null,Locale.ENGLISH));
		// 使用中文
		System.out.println("from message_info:"+ms.getMessage("demo.title", null, null,Locale.CHINESE));
		System.out.println("from message_error:"+ms.getMessage("error.except", null, null,Locale.CHINESE));
	}
}

2、xml模式配置,示例如下:

<bean id="example" class="com.demo.Example">
		<property name="messages" ref="messageSource"/>
	</bean>

3、还可以使用MessageSourceAware接口获取应用程序容器的MessageSource引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐享技术

每一个打赏,都是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值