Spring-国际化信息02-MessageSource接口

简介: Spring-国际化信息02-MessageSource接口

概述

spring定义了访问国际化信息的MessageSource接口,并提供了几个易用的实现类.


MessageSource接口方法


我们先看下源码,先来了解一下该接口的几个重要方法

20170811035225375.jpg

String getMessage(String code, Object[] args, String defaultMessage, Locale locale)

code表示国际化资源中的属性名;args用于传递格式化串占位符所用的运行期参数;当在资源找不到对应属性名时,返回defaultMessage参数所指定的默认信息;locale表示本地化对象;


String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;


与上面的方法类似,只不过在找不到资源中对应的属性名时,直接抛出NoSuchMessageException异常;


String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;


MessageSourceResolvable 将属性名、参数数组以及默认信息封装起来,它的功能和第一个接口方法相同。


MessageSource类结构


20170811035751918.jpg20170811035639325.jpg



其中:


HierarchicalMessageSource接口添加了两个方法,建立父子层级的MessageSource结构 ,setParentMessageSource (MessageSource parent)方法用于设置父MessageSource,而getParentMessageSource()方法用于返回父MessageSource。

20170811035959310.jpg


HierarchicalMessageSource接口最重要的两个实现类是

ResourceBundleMessageSource 和ReloadableResourceBundleMessageSource。


20170811040230446.jpg


它们基于Java的ResourceBundle基础类实现,允许仅通过资源名加载国际化资源。

ReloadableResourceBundleMessageSource提供了定时刷新功能,允许在不重启系统的情况下,更新资源的信息。

StaticMessageSource主要用于程序测试,它允许通过编程的方式提供国际化信息。

DelegatingMessageSource是为方便操作父MessageSource而提供的代理类。


ResourceBundleMessageSource


该实现类允许用户通过beanName指定一个资源名(包括类路径的全限定资源名),或通过beanNames指定一组资源名.


实例


代码已托管到Github—> https://github.com/yangshangwei/SpringMaster


20170812124301189.jpg


资源文件:

greeting.common=How are you {0}?,today is {1}
greeting.morning=Good Morning {0}! now is {1,time,short}
greeting.afternoon=Good Afternoon {0}! now is {1,date,long}


通过ResourceBundleMessageSource配置Bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:util="http://www.springframework.org/schema/util" 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
        http://www.springframework.org/schema/util 
     http://www.springframework.org/schema/util/spring-util.xsd">
    <bean id="resource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames" ref="resourceList"/>
    </bean>
    <util:list id="resourceList">
        <value>i18n/fmt_resource</value>
    </util:list>
</beans>


测试类

启动Spring容器,并通过MessageSource访问配置的国际化资源

package com.xgj.ioc.i18n.messageSource;
import java.util.GregorianCalendar;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MessageSourceTest {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:com/xgj/ioc/i18n/messageSource/beans.xml");
        // 获取MessageSource的Bean
        MessageSource messageSource = ctx.getBean("resource",
                MessageSource.class);
        // 动态参数
        Object[] objs = { "Xiaogongjiang", new GregorianCalendar().getTime() };
        // 获取格式化的国际化信息
        String msg1 = messageSource.getMessage("greeting.common", objs,
                Locale.CHINESE);
        String msg2 = messageSource.getMessage("greeting.morning", objs,
                Locale.US);
        String msg3 = messageSource.getMessage("greeting.afternoon", objs,
                Locale.CHINESE);
        System.out.println(msg1);
        System.out.println(msg2);
        System.out.println(msg3);
    }
}



运行结果:

20170812125444503.jpg


通过Spring我们无须再分别加载不同语言、不同国家/地区的本地化资源文件,仅仅通过资源名就可以加载整套的国际化资源文件。此外,我们无须显式使用MessageFormat操作国际化信息,仅通过MessageSource# getMessage()方法就可以完成操作了.


比较下 和 http://blog.csdn.net/yangshangwei/article/details/76946002#resourceboundle 这里的区别。


ReloadableResourceBundleMessageSource


该实现类比之于ResourceBundleMessageSource的唯一区别在于它可以定时刷新资源文件,以便在应用程序不重启的情况下感知资源文件的变化。很多生产系统都需要长时间持续运行,系统重启会给运行带来很大的负面影响。这时,通过该实现类就可以解决国际化信息更新的问题


实例



20170812124218151.jpg

资源文件同上

通过ReloadableResourceBundleMessageSource配置资源

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:util="http://www.springframework.org/schema/util" 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
        http://www.springframework.org/schema/util 
     http://www.springframework.org/schema/util/spring-util.xsd">
    <bean id="resource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames" ref="resourceList"/>
        <!-- 刷新资源文件的周期,以秒为单位 -->
        <property name="cacheSeconds" value="5"/>
    </bean>
    <util:list id="resourceList">
        <value>i18n/fmt_resource</value>
    </util:list>
</beans>

我们通过cacheSeconds属性让ReloadableResourceBundleMessageSource每5秒钟刷新一次资源文件(在真实的应用中,刷新周期不能太短,否则频繁的刷新将带来性能上的负面影响,一般不建议小于30分钟)。cacheSeconds默认值为-1表示永不刷新,此时,该实现类的功能就蜕化为ResourceBundleMessageSource的功能。


测试类:

package com.xgj.ioc.i18n.reloadableResourceBundleMessageSource;
import java.util.GregorianCalendar;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ReloadableResourceBundleMessageSourceTest {
    public static void main(String[] args) throws Exception {
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:com/xgj/ioc/i18n/reloadableResourceBundleMessageSource/beans.xml");
        MessageSource messageSource = ctx.getBean("resource",
                MessageSource.class);
        Object[] objects = { "XiaoGongJiang", new GregorianCalendar().getTime() };
        for (int i = 0; i < 2; i++) {
            String msg = messageSource.getMessage("greeting.common", objects,
                    Locale.US);
            System.out.println(msg + "\nsleep 20S");
            Thread.sleep(20000);
        }
    }
}


让程序睡眠20秒钟,在这期间,我们将fmt_resource_en_US.properties 中的 greeting.common改为

greeting.common=***How are you {0}?,today is {1}


运行结果:


20170812125401913.jpg


两次输出的格式化信息分别对应更改前后的内容,也即本地化资源文件的调整被自动生效了

相关文章
|
11月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
208 0
|
6月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1222 10
|
XML Java 数据格式
探索Spring之利剑:ApplicationContext接口
本文深入介绍了Spring框架中的核心接口ApplicationContext,解释了其作为应用容器的功能,包括事件发布、国际化支持等,并通过基于XML和注解的配置示例展示了如何使用ApplicationContext管理Bean实例。
607 6
|
7月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
1367 1
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
3518 1
|
自然语言处理 JavaScript Java
Spring 实现 3 种异步流式接口,干掉接口超时烦恼
本文介绍了处理耗时接口的几种异步流式技术,包括 `ResponseBodyEmitter`、`SseEmitter` 和 `StreamingResponseBody`。这些工具可在执行耗时操作时不断向客户端响应处理结果,提升用户体验和系统性能。`ResponseBodyEmitter` 适用于动态生成内容场景,如文件上传进度;`SseEmitter` 用于实时消息推送,如状态更新;`StreamingResponseBody` 则适合大数据量传输,避免内存溢出。文中提供了具体示例和 GitHub 地址,帮助读者更好地理解和应用这些技术。
2572 121
|
11月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
在微服务架构中,随着业务复杂度增加,项目可能需要调用多个微服务。为避免使用`@Value`注解逐一引入配置的繁琐,可通过定义配置类(如`MicroServiceUrl`)并结合`@ConfigurationProperties`注解实现批量管理。此方法需在配置文件中设置微服务地址(如订单、用户、购物车服务),并通过`@Component`将配置类纳入Spring容器。最后,在Controller中通过`@Resource`注入配置类即可便捷使用,提升代码可维护性。
225 0
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
493 7
|
存储 数据采集 Java
Spring Boot 3 实现GZIP压缩优化:显著减少接口流量消耗!
在Web开发过程中,随着应用规模的扩大和用户量的增长,接口流量的消耗成为了一个不容忽视的问题。为了提升应用的性能和用户体验,减少带宽占用,数据压缩成为了一个重要的优化手段。在Spring Boot 3中,通过集成GZIP压缩技术,我们可以显著减少接口流量的消耗,从而优化应用的性能。本文将详细介绍如何在Spring Boot 3中实现GZIP压缩优化。
1962 6

热门文章

最新文章