Spring messageSource

  Spring提供了一个接口MessageSource用于获取国际化信息。有这么几个类值得注意,用于在项目中启用国际化信息功能,一个抽象类AbstractMessageSource,继承该抽象类的有四个类,分别为ResourceBundleMessageSource,ReloadableResourceBundleMessageSource,StaticMessageSource,

SpringSecurityMessageSource。各个类的功能相当,只是用处不同,查看Spring的javadoc发现,StaticMessageSource主要用于测试环境,编写测试类,并不用于生产环境,而SpringSecurityMessageSource用于Spring security的国际化信息。

 

  因为ApplicationContext继承并实现了MessagSource接口,所以ApplicationContext自身提供了国际化信息功能,想要在项目中实现国际化信息功能常用可以有两种做法。

 

  在介绍这两种做法之前,需要事先定义好国际化文件,如图:

 

  internationalization files

 

  在这里,我是在测试环境中来测试Spring提供的国际化信息功能,其中文件名为testInfo的Resource bundle

中有三个国际化文件文件,分别为英语,日语,中文,这里的国际化文件命名有一定的规范,如果不符合规范,那么Spring是无法解析国际化文件的,不能知道你哪个文件是哪个语言的国际化文件。国际化文件命名规范遵从 ${filename}_${languagename}_${countryname},其中${}是需要替代的内容,下划线是必需的分隔符,所以如果你想要定义一个法语国际化文件应该是这样的 testInfo_fr_FR,至于language和countryname的取名请参见java.util.Locale类,里面有详细说明。

 

  一。使用ApplicationContext提供的国际化信息功能

 

  启用ApplicationContext的国际化功能需要在ApplicationContext配置文件进行这样的定义

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
           <property name="basenames">
               <list>
                   <value>testError</value>
                   <value>testMessage</value>
                   <value>testInfo</value>
               </list>
           </property>
    </bean>

    <!--<bean id="messageSource" class="org.springframework.security.core.SpringSecurityMessageSource">-->
        <!--<property name="parentMessageSource" ref="resourceBundleMessageSource"/>-->
    <!--</bean>-->

    <!--<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">-->
           <!--<property name="parentMessageSource"  ref="resourceBundleMessageSource"/>-->
    <!--</bean>-->

    <!--<bean id="messageSource" class="org.springframework.context.support.StaticMessageSource">-->
           <!--<property name="parentMessageSource" ref="resourceBundleMessageSource"/>-->
    <!--</bean>-->
</beans>

 

  注释部分可以暂时不管,这里定义了一个MessageSource的实现类ResourceBundleMessageSource用于提供国际化功能,这里的id命名记得一定要以messageSource命名,因为研究AbstractApplicationContext会发现里面定义了一个messageSource属性,提供的set方法就是setMessageSource,Spring在初始化时会将ApplicationContext配置文件中id为messageSource的bean注入到ApplicationContext类中去,这样我们就可以使用ApplicationContext提供的国际化功能了。以下是测试类:

 

 


package com.dream.message;

import junit.framework.TestCase;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Locale;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-9-10
 * Time: 上午10:08
 */
public class MessageSourceTest extends TestCase {

    public void testResourceBundleMessageSource() throws Exception {
        MessageSource messageSource = new ClassPathXmlApplicationContext("testApplicationContext.xml");
        String message1 = messageSource.getMessage("info.one", null, Locale.CHINESE);
        String message2 = messageSource.getMessage("info.one", null, Locale.JAPAN);
        String message3 = messageSource.getMessage("info.one", null, Locale.US);
        assertEquals("This is the first message which language is Chinese.", message1);
        assertEquals("This is the first message which language is Japanese.", message2);
        assertEquals("This is the first message which language is English.", message3);
    }
}

 

  二。使用自定义的国际化信息功能

 

 

  想实现自定义的国际化信息功能,只需要自定义一个类,向该类中注入messageSource即可,这样就可以使用该接口中提供的方法来获取国际经信息了,其实与第一种方式并无二异。

你可能感兴趣的:(messageSource)