【Java.Spring.Core】【IoC】ApplicationContext的附加功能(国际化,未完待续)

正如前面所述, org.springframework.beans.factory 包提供了管理和操纵beans的基本功能。

org.springframework.context包增加了一个 ApplicationContext 接口,其扩展了 BeanFactory接口,使其更加适合应用程序的使用。


为了另 BeanFactory 的功能更加适合作为一个框架来使用, context 包提供了下列的功能

  • 通过 MessageSource 接口来以 i18n 方式来访问 message
  • 通过ResourceLoader接口访问资源,如URLs或者文件
  • 通过ApplicationEventPublicsher接口实现向实现了ApplicationListener接口的beans发送事件
  • 通过HierarchiaclBeanFactory接口加载多个Context,这可以另每个特定的Context用于特定的层次,例如应用程序的web层

使用MessageSource接口的国际化(i18n)

ApplicationContext接口继承了 MessageSource 接口,其提供了国际化( i18n) 的功能。

Spring同时提供了HierarchicalMessageSource接口,可以用来继承地解析 message。

这些接口共同用于 message 的解析。

这些接口定义了如下的方法:

  • String getMessage(String code, Object[] args, String default, Locale loc) - 从MessageSource中取出消息的基本方法;如果对于特定的locale,没有message被找到,则使用默认的message;传入的参数作为替代的值
  • String getMessage(String code, Object[] args, Locale loc) - 与前面的方法基本相同,但是如果特定locale的message没有找到,没有默认的message可用,会抛出NoSuchMessageException异常
  • String getMessage(MessageSourceResolvable resolvable, Locale locale) - 前面方法的参数被包裹在类MessageSourceResolvable的对象中

Spring提供了两个MessageSource的实现类:ResourceBundleMessageSource和StaticMessageSource。它们都实现了HIerarchicalMessageSource接口。StaticMessageSource使用的较少。

ResourceBundleMessageSource示例如下:

<beans>
    <bean id="messageSource"
            class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>format</value>
                <value>exceptions</value>
                <value>windows</value>
            </list>
        </property>
    </bean>
</beans>

在上面的例子中,我们在classpath可用的路径中定义了3个资源:format, exception, windows。任何解析 message的请求都将会由 ResourceBundles来解析。

假设上例中的两个资源文件为:

# in format.properties
message=Alligators rock!
# in exceptions.properties
argument.required=The {0} argument is required.


使用编程方式使用MessageSource的方式如下,

public static void main(String[] args) {
    MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
    String message = resources.getMessage("message", null, "Default", null);
    System.out.println(message);
}

输出的结果如下:

Alligators rock!


MessageSource bean定义在beans.xml 配置文件中。 messageSource bean的定义中依赖一些资源(resource bundles),其属性名为 basenames。传入 basenames 属性list中值为属性文件,分别是 format.properites, exceptions.properties, windows.properties。


下面的例子展示了查找 message 时使用参数,这些参数被嵌入查找的message中的占位符中:

<beans>

    <!-- this MessageSource is being used in a web application -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="exceptions"/>
    </bean>

    <!-- lets inject the above MessageSource into this POJO -->
    <bean id="example" class="com.foo.Example">
        <property name="messages" ref="messageSource"/>
    </bean>

</beans>

public class Example {

    private MessageSource messages;

    public void setMessages(MessageSource messages) {
        this.messages = messages;
    }

    public void execute() {
        String message = this.messages.getMessage("argument.required",
            new Object [] {"userDao"}, "Required", null);
        System.out.println(message);
    }

}

execute方法的执行结果如下:

The userDao argument is required.


另外的例子,如果希望解析British(en-GB) locale的message,需要创建文件:format_en_GM.properties, exceptions_en_GM.properties, windows_en_GB.properties。我们显示指定使用的Locale,

# in exceptions_en_GB.properties
argument.required=Ebagum lad, the {0} argument is required, I say, required.

public static void main(final String[] args) {
    MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
    String message = resources.getMessage("argument.required",
        new Object [] {"userDao"}, "Required", Locale.UK);
    System.out.println(message);
}

输出的结果为:

Ebagum lad, the userDao argument is required, I say, required.

我们也可以使用 MessageSourceAware 接口来获取任意定义的MessageSource 引用。

我们也可以使用 ReloadableResourceBundleMessageSource 来替代 ResourceBundleMessageSource,其可以从任意Spring resource位置加载属性文件,并且可以实现属性文件的热加载。


标准/自定义事件


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值