大家看了我写的spring 国际化(1)后,应该会发现如果要获取资源文件的信息时,需要将配置文件中的资源文件bean注入到你正在操作的bean以后,才能使用。
spring的做法是将国际化资源作成系统级别的,对任何组件都进行开放。
实现方法如下:
org.springframework.context.ApplicationContext这个接口也继承了org.springframework.context.MessageSource接口
spring容器在启动时会调用initMessageSource()方法,它的作用就是初始化容器中的国际化资源。
根据反射机制,从BeanDefinitionRegistry中找到名为“messageSource”并且类型为org.springframework.context.MessageSource的bean,将它加载为容器级的国际化资源文件。
例如:下面的xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd "> <!-- 名城必须为messageSource, 类型必须为org.springframework.context.MessageSource --> <!-- class为ResourceBundleMessageSource或ReloadableResourceBundleMessageSource都可以(区别已比较过) --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> --> <property name="basenames"> <list> <value>spring3/local/application</value> </list> </property> </bean> </beans>
测试
package spring3.local; import java.util.Locale; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MessageResourceMain { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "spring3/local/message_resource.xml"); System.out.println("CHINA:" + context.getMessage("greeting.morning", null, Locale.CHINA)); System.out.println("JAPAN:" + context.getMessage("greeting.morning", null, Locale.JAPAN)); System.out.println("US:" + context.getMessage("greeting.morning", null, Locale.US)); System.out.println("CANADA:" + context.getMessage("greeting.morning", null, Locale.CANADA)); } }
输出结果
CHINA:早上好 JAPAN:お早うございます US:good night! CANADA:お早うございます