`
bug-x
  • 浏览: 2262 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

spring中ResourceBundleMessageSource与ReloadableResourceBundleMessageSource查找资源的区别

阅读更多
spring中ResourceBundleMessageSource与ReloadableResourceBundleMessageSource查找资源的区别:

1.ResourceBundleMessageSource在xml配置中无法指定编码:

     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">

     <property NAME="basenames">

          <LIST>

               <VALUE >error</VALUE >

               <VALUE >message</VALUE >

          </LIST>      

         </property>

     </bean>

而ReloadableResourceBundleMessageSource可以指定编码,譬如:

     <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

        <property NAME="defaultEncoding" VALUE ="gbk" />

        <property NAME="basename" VALUE ="message" />

</bean>

2.加载资源文件的方式不同:

1).下面看下它们的源代码:

ResourceBundleMessageSource的加载,使用ClassUtils.getDefaultClassLoader()加载器,getDefaultClassLoader的方法代码如下:

p lic static ClassLoader getDefaultClassLoader()

{

    ClassLoader cl = NULL;

    try {

      cl = Thread.currentThread().getContextClassLoader();

   }

    catch (Throwable ex) {

      logger.debug("Cannot access thread context ClassLoader - falling back to system class loader", ex);

    }

    IF (cl == NULL)

    {

      cl = ClassUtils.class.getClassLoader();

    }

    RETURN cl;

}

//这种方式也是JVM默认的加载方式,先从当前线程中获取类加载器,如果没有,就获取这个类本身的类加载器

2).ReloadableResourceBundleMessageSource默认也使用ClassUtils.getDefaultClassLoader()加载器,它加载资源的方式如下:

p lic Resource getResource(STRING location)

{

    Assert.notNull(location, "Location must not be null");

    IF (location.startsWith("classpath:")) {

      RETURN NEW ClassPathResource(location.s STRING("classpath:".LENGTH()), getClassLoader());

    }

    try

    {

      URL url = NEW URL(location);

      RETURN NEW UrlResource(url);

    }

    catch (MalformedURLException ex)

    {

      RETURN getResourceByPath(location);

    }

}

3). 小结:ResourceBundleMessageSource从classloader中加载资源文件,可以找到,

ReloadableResourceBundleMessageSource加载时,默认使用DefaultResourceLoader,他会先判断资源path是否带有classpath:前缀,如果有,用 ClassPathResource去加载资源文件,如果没有试着用文件协议的url去访问,再没有就在contextPath即WEB-INF下查找。

下面做一个Spring的MessageSource的示例:

1.我们单独新建一个spring消息文件beans-message.xml中加如下配置:

   <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">

       <property NAME="basenames">

            <LIST>

                 <VALUE >error</VALUE>

                 <VALUE >message</VALUE >

            </LIST>

       </property>

   </bean>

2.这段配置假定在你的classpath中有两个资源文件(resource bundle),它们是error, message。通过ResourceBundle,使用JDK中解析消息的标准方式,来处理任何解析消息的请求。出于示例的目的,假定 message_zh_CN.properties的资源文件的内容为…

msg.common.serverBusy = \非\常\抱\歉,\系\统\十\分\繁\忙\!

#非常抱歉,系统十分繁忙!

msg.argument.required={0}\是\个\必\填\项\!

#{0}是个必填项!

3.再写一个测试类:

p lic class MessageTest {

     p lic static void main(STRING[] args) {

         MessageSource resources = NEW ClassPathXmlApplicationContext("beans-message.xml");

         STRING message = resources.getMessage("msg.common.serverBusy", NULL, "Default", NULL);

         System.out.println(message);

         STRING message1 = resources.getMessage("msg.argument.required", NEW Object[] { "'联系方式'" }, NULL, Locale.CHINA);

         System.out.println(message1);

     }

}

结果输入为:

非常抱歉,系统十分繁忙!

'联系方式'是个必填项!

3.在我们的项目中,MessageSource不会单独使用,通常我们会把它和自己的业务一起使用,这时候我们可以直接用它本身的方法,我们也可以在其中加入我们自己的逻辑:如,自定义的一个消息类:

p lic class MessageSourceHelper {

     private ResourceBundleMessageSource messageSource;

     p lic STRING getMessage(STRING CODE, Object[] args, STRING defaultMessage, Locale locale) {

         STRING msg = messageSource.getMessage(CODE, args, defaultMessage, locale);

         RETURN msg != NULL ? msg.trim() : msg;

     }

    

     p lic void setMessageSource(ResourceBundleMessageSource messageSource) {

         this.messageSource = messageSource;

     }

}

在beans-message.xml中注入:

   <bean id="messageSourceHelper" class="com.myspring.message.MessageSourceHelper">

       <property NAME="messageSource">

           <ref LOCAL="messageSource" />

       </property>

   </bean>

4.我们可以在MessageSourceHelper中加入自己的业务,注入依赖后,就可以在其他类中调用MessageSourceHelper中的方法。

5.理论简要:ApplicationContext接口扩展了MessageSource 接口,因而提供了消息处理的功能(i18n或者国际化)。与HierarchicalMessageSource一起使用,它还能够处理嵌套的消息,这些是Spring提供的处理消息的基本接口。让我们快速浏览一下它所定义的方法:

     · STRING getMessage(STRING CODE, Object[] args, STRING DEFAULT, Locale loc):用来从MessageSource获取消息的基本方法。如果在指定的locale中没有找到消息,则使用默认的消息。args中的参数将使用标准类库中的MessageFormat来作消息中替换值。

     · STRING getMessage(STRING CODE, Object[] args, Locale loc):本质上和上一个方法相同,其区别在:没有指定默认值,如果没找到消息,会抛出一个NoS hMessageException异常。

     · STRING getMessage(MessageSourceResolvable resolvable, Locale locale):上面方法中所使用的属性都封装到一个MessageSourceResolvable实现中,而本方法可以指定 MessageSourceResolvable实现。

当一个ApplicationContext被加载时,它会自动在context中查找已定义为MessageSource类型的bean。此bean的名称须为messageSource。如果找到,那么所有对上述方法的调用将被委托给该 bean。否则ApplicationContext会在其父类中查找是否含有同名的bean。如果有,就把它作为MessageSource。如果它最终没有找到任何的消息源,一个空的StaticMessageSource将会被实例化,使它能够接受上述方法的调用。

Spring目前提供了两个MessageSource的实现:ResourceBundleMessageSource和StaticMessageSource。它们都继承 NestingMessageSource以便能够处理嵌套的消息。StaticMessageSource很少被使用,但能以编程的方式向消息源添加消息。ResourceBundleMessageSource会用得更多一些,

6. 更多的资料参考spring官方开发手册,很详尽的!

转自:http://meiyx.iteye.com/blog/1028589
分享到:
评论

相关推荐

    狂神Spring Security静态资源

    在这个名为"狂神Spring Security静态资源"的资料中,我们可以期待学习到关于如何保护Web应用中的静态资源不被未经授权的用户访问。 首先,了解Spring Security的基本概念是必要的。它主要由四个组件构成:...

    Spring 3 MVC 国际化 ResourceBundleMessageSource spring:message

    一个简单的基于Maven 3 和 Spring mvc 3 框架搭建的国际化网站雏形。 spring mvc 入门配置 国际化配置 易扩展。 error_messages_en.properties error_messages_zh.properties 没有库文件,maven配好了会自动加载库...

    狂神spring-security静态资源.zip

    这个"狂神spring-security静态资源.zip"文件很可能包含了Spring Security的相关教程、代码示例或配置文件,帮助用户理解和学习如何在Spring应用中实现安全控制。下面我们将深入探讨Spring Security的核心概念、功能...

    Spring框架高级源码笔记+Spring Boot data mongoDB中文文档 资源合集

    Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅... 本文档是Spring框架高级源码笔记+Spring Boot data mongoDB中文文档 资源合集

    浅析Spring配置中的classpath:与classpath*:的区别

    classpath: 只会到你的 class 路径中查找文件,不会包括 jar 文件中的 class 路径。 classpath*:是指不仅包含 class 路径,还包括 jar 文件中的 class 路径进行查找。classpath*:会遍历所有的 classpath,所以加载...

    spring资源访问的一个例子

    本示例将详细介绍如何在Spring Boot项目中实现资源的访问。 首先,让我们了解Spring Boot对资源的默认配置。Spring Boot会自动配置`WebMvcAutoConfiguration`,它包含了处理静态资源的策略。默认情况下,它会从`src...

    SpringBoot项目+SpringSecurity+前端静态资源

    在本项目中,"SpringBoot项目+SpringSecurity+前端静态资源"是一个综合性的开发实践,主要涉及了Spring Boot和Spring Security这两个核心的Java框架,以及前端的静态资源管理。Spring Boot简化了Java应用的初始化和...

    spring源码中英文注释

    源码中会涉及资源文件的加载和消息的查找。 10. **SpEL(Spring Expression Language)**:Spring的表达式语言用于在运行时查询和操作对象图。它在Spring的许多特性中都有应用,例如AOP的pointcut表达式和bean属性...

    SpringSecurity静态资源.rar

    在“SpringSecurity静态资源.rar”这个压缩包中,我们可以推测包含的是与SpringSecurity项目相关的静态资源文件,如CSS样式表、JavaScript脚本、图片等,这些文件通常用于构建Web应用的前端界面。 SpringSecurity在...

    狂神说SpringSecurity静态资源.rar

    在`templates`目录中,很可能包含了一些示例的登录、注册页面以及其他的用户界面,这些页面与SpringSecurity的认证和授权过程密切相关。例如,自定义登录页面需要配置`formLogin()`,而注销操作则需要配置`logout()`...

    spring 源码中文注释

    总的来说,"spring 源码中文注释"是一个宝贵的资源,它将带领我们走进Spring的内部世界,揭示那些在日常开发中看似透明的机制。通过学习源码,我们可以更全面地掌握Spring框架,提升自己的技术水平,更好地应对各种...

    spring mvc + spring + hibernate + bootstrap + mysql 人力资源管理系统.zip

    《基于Spring MVC、Spring、Hibernate、Bootstrap和MySQL的人力资源管理系统》 本项目是一个综合性的企业级应用,采用主流的Java技术栈构建,包括Spring MVC、Spring、Hibernate以及前端的Bootstrap框架,配合关系...

    spring依赖资源包

    这个"spring依赖资源包"很可能是包含了一系列与Spring框架相关的库文件,这些文件通常以JAR格式存在,位于一个名为"lib"的目录下。在Java项目中,"lib"目录用于存放所有项目的外部依赖,使得应用程序能够正确运行。 ...

    spring-framework-4.3.16.RELEASE-dist

    最新 spring mvc 资源,最新 spring mvc 资源,最新 spring mvc 资源,最新 spring mvc 资源,最新 spring mvc 资源,最新 spring mvc 资源,最新 spring mvc 资源,最新 spring mvc 资源,最新 spring mvc 资源,...

    Spring+Hibernate+Struts资源共享系统

    Spring 是一个开源的 Java 应用框架,主要为解决企业级应用开发中的复杂性而设计。它提供了全面的事务管理、数据访问集成、AOP(面向切面编程)等核心功能。在本项目中,Spring 负责管理应用程序的各个组件,提供...

    Spring的约束资源

    在Spring框架中,"约束资源"通常指的是对应用程序中各种组件的行为进行规范和限制的机制。这涵盖了诸如数据验证、依赖注入的约束以及资源管理等多个方面。Spring为开发者提供了丰富的工具和API,使得我们可以构建...

    springcloud 资源大全

    具体细节可能在资源包中会有介绍,包括它的功能、如何集成到SpringCloud环境、如何与其他微服务组件配合使用等。 4. **视频教程**:资源包中的视频教程可能是逐步指导如何使用SpringCloud、Vue.js以及PigX进行实际...

    Spring技术内幕:深入解析Spring架构与设计原理

    下载频道&gt;资源分类&gt;开发技术&gt;Java&gt;Spring技术内幕:深入解析Spring架构与设计原理 1/2 Spring技术内幕:深入解析Spring架构与设计原理 1/2资源大小:59MB 上传日期:2011-11-15 资源积分:5分 下载次数:30 上 传 者...

    spring2.5中文文档

    6. **国际化(I18N)**:Spring 2.5提供了更好的国际化支持,包括对`ResourceBundleMessageSource`的改进,使得开发者可以更方便地管理多语言资源。 7. **轻量级HTTP客户端**:Spring 2.5引入了`...

    Spring中英文资料

    这个"Spring中英文资料"包含的是关于Spring 2.0版本的文档,提供了中文和英文两种语言的学习资源,对于想要深入理解Spring的开发者来说非常实用。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)、...

Global site tag (gtag.js) - Google Analytics