`
meiyx
  • 浏览: 183739 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Spring消息代码理解

阅读更多
一、简介

1、Spring消息体系的定义:

①消息取得接口:MessageSource、HierarchicalMessageSource
②消息参数接口:MessageSourceResolvable

2、Spring消息体系的实现:

①消息取得:AbstractMessageSource、ResourceBundleMessageSource、ReloadableResourceBundleMessageSource、StaticMessageSource
②消息参数:DefaultMessageSourceResolvable、FieldError、ObjectError

3、Spring消息体系的使用:

①ApplicationContext、MessageSourceAware

二、Spring消息体系的定义
1、MessageSource:

定义个三个getMessage操作:

•String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
•String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;
•String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
Spring为一个取得消息的操作,提供了三个方法,细化了取消息操作的不同需求。一种提供默认消息,不报异常;一种不提供默认消息,报NoSuchMessageException;一种使用MessageSourceResolvable封装需要的参数,虽然封装的参数中提供了默认消息,但为防止提供了无效的默认消息,还是报了NoSuchMessageException。

2、HierarchicalMessageSource:

继承MessageSource接口,添加了两个操作:

•void setParentMessageSource(MessageSource parent);
•MessageSource getParentMessageSource();
Spring通过这两个方法提供了一种实现MessageSource层次的定义

3、MessageSourceResolvable:

为了方便MessageSource的使用,Spring定义了取消息使用的参数对象,提供了三个操作:

•public String[] getCodes();
•public Object[] getArguments();
•public String getDefaultMessage();
4、接口定义中的智慧

①MessageSource与HierarchicalMessageSource接口的分离,为两个不同的目的都定义了清晰的接口。虽然了Spring的MessageSource的实现都继承与HierarchicalMessageSource,当时因为MessageSource接口的存在,可以使ApplicationContext接口直接提供一个标准的取得消息的方法集,而不用去关心消息体系的具体实现。
②提供MessageSourceResolvable接口,方便消息的使用。取得消息时不需要自己组织多个参数,而是直接将一个MessageSourceResolvable的实现传入即可。
③MessageSourceResolvable接口为什么不提供getLocal()操作?国际化应该是与业务实现无关,不应该是由业务实现去考虑。最好通过配置,或其他方法自动取得。

三、Spring消息体系的实现
1、AbstractMessageSource

①实现了HierarchicalMessageSource接口,提供了MessageSource的一个基本的抽象实现,并提供protected abstract MessageFormat resolveCode(String code, Locale locale);方法,留给子类自己决定自己的国际化实现。
②提供的属性:

•private boolean useCodeAsDefaultMessage = false;
定义当没有提供Default Message时,是否使用Message Code作为Default Message。

•private boolean alwaysUseMessageFormat = false;
当没有消息参数时,是否还是使用MessageFormat。当消息中包含一些需要MessageFormat特殊处理的逃逸字符时,需要设置为true。
③实现操作祥解:

•void setParentMessageSource(MessageSource parent);
•MessageSource getParentMessageSource();
④实现了消息的层次操作,并将父MessageSource保存。

•String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
•String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;
•String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
所有取得消息的操作都有getMessageInternal()方法实现。根据默认消息取得默认消息时,使用renderDefaultMessage()方法。无默认消息根据useCodeAsDefaultMessage属性,取得默认消息时使用getDefaultMessage()方法。
⑤getMessageInternal()方法的实现:

•无消息参数,且alwaysUseMessageFormat为false时,调用resolveCodeWithoutArguments()方法直接取得消息。其实在resolveCodeWithoutArguments()方法的实现中还是使用MessageFormat,所以Spring建议在子类中覆盖resolveCodeWithoutArguments()方法。
•否则,先调用resolveArguments()方法将参数中的MessageSourceResolvable实例转化为对应的消息,然后调用resolveCode()取得MessageFormat,之后使用MessageFormat处理消息。
•当没有找到消息时,调用getMessageFromParent()方法,从父MessageSource中查找消息。
⑥cachedMessageFormats
考虑到多数DefaultMessage都是一些同样错误消息,所以Spring使用一个HashMap—cachedMessageFormats缓存了DefaultMessage的MessageFormat。

2、StaticMessageSource
继承AbstractMessageSource类,提供了最简单的MessageSource的实现。提供了两个操作:

•addMessage()将消息编号和对应的MessageFormat保存于一个HashMap中。
•resolveCode()根据消息编号和Local从HashMap中取得对应的MessageFormat。
3、ResourceBundleMessageSource
继承AbstractMessageSource类,实现了BeanClassLoaderAware接口,提供了一种使用Resource Bundle的Message Source的实现。

•basenames属性
可以指定一个或一组查找message的文件,可包含目录和Classpath。
resolveCodeWithoutArguments()覆盖了父类的对应方法,实现了直接从配置文件读取message并直接返回,不使用MessageFormat。

•resolveCode()
调用getResourceBundle()取得对应的ResourceBundle,然后通过取得的ResourceBundle取得对应的MessageFormat。

•ResourceBundleMessageSource中的缓存实现。
•ResourceBundle缓存
针对每一个Basename都缓存一个不同Local的HashMap。

•MessageFormat缓存
针对每一个ResourceBundle都缓存一个Code的Map,其中缓存了一个Code的不同Local的MessageFormat。

4、ReloadableResourceBundleMessageSource

继承AbstractMessageSource类,实现了ResourceLoaderAware接口,提供了一种可以Reload的MessageSource的实现。
通过自己实现的PropertiesPersister和PropertiesHolder,跳过ResoureBundle的缓存机制,实现一个可以刷新的MessageSoruce。

四、Spring消息体系的使用

1.ApplicationContext
实现了MessageSource接口,将getMessage的调用转发给实际的MessageSource的实现。
2.MessageSourceAware
当Spring的IOC容器发现实现了此接口的实例,就会将ApplicationContext注入到此实例中。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shrekmu/archive/2007/05/20/1617795.aspx
分享到:
评论

相关推荐

    Spring源代码解析

    本文将深入解析Spring的源代码,帮助开发者理解其内部机制,提升对框架的使用技巧和定制能力。 首先,Spring的核心模块包括IoC(Inversion of Control,控制反转)容器、AOP、数据访问/集成、Web模块等。IoC容器是...

    spring入门代码项目

    本项目旨在帮助初学者快速入门Spring,通过实际的代码操作来理解和掌握Spring的核心概念与用法。以下是对每个子文件夹的详细解释: 1. **Spring-01-HelloWorld** 这个部分是Spring入门的基础,它涵盖了如何创建第...

    Spring 入门代码实例

    理解并熟练应用Spring的依赖注入机制是成为一名优秀的Java开发者的关键步骤之一。通过设值注入和构造注入,我们可以轻松地管理对象的生命周期,减少代码间的耦合。结合JUnit进行测试,能够确保代码的质量和稳定性。...

    spring 入门示例代码

    这个"spring 入门示例代码"是一个适合初学者理解并实践Spring框架基础知识的资源包。 在压缩包中,文件通常会包含对整个示例的简要介绍和指导,帮助用户了解如何运行和理解这些代码。由于没有具体的readme内容,...

    spring实战全部源代码.zip

    《Spring实战》第五版的源代码压缩包"spring实战全部源代码.zip"包含了全面的示例项目,旨在帮助读者深入理解和应用Spring框架。这个压缩包中的"spring-in-action-5-samples-master"目录揭示了书中的各个实战案例,...

    Spring源代码解析(一):IOC容器.doc

    理解Spring的IOC容器,尤其是BeanFactory接口,有助于深入探究Spring如何管理对象的生命周期、依赖关系和装配过程。通过源代码阅读,我们可以看到Spring如何优雅地将这些复杂的概念转化为可扩展和灵活的代码,从而更...

    spring源代码

    源代码分析有助于深入理解Spring的工作原理,提升编程技能,并且能够帮助开发者在遇到问题时进行调试和优化。 1. **Spring IoC容器**: Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。通过XML配置...

    精通spring 源代码

    《精通Spring源代码》是罗时飞先生关于Spring框架深入解析的一部著作,旨在帮助开发者更深入地理解Spring的工作原理,提升对Java企业级应用开发的掌控能力。本压缩包包含的文件名为“精通Spring源码”,这通常是一个...

    Spring示例代码

    这个压缩包中的“Spring示例代码”可能是为了帮助开发者理解和学习Spring框架的各种功能和用法。下面,我们将深入探讨Spring框架的核心概念、主要模块以及如何使用这些示例代码来提升你的开发技能。 Spring框架的...

    spring 源代码

    Spring 源代码是开发者深入理解这一流行Java应用框架的关键资源。Spring框架以其模块化、易用性和灵活性闻名,广泛应用于企业级应用开发。通过阅读和分析Spring的源代码,我们可以深入了解其工作原理,提高编程技能...

    Spring源代码下载

    通过阅读Spring源码,开发者不仅可以理解其设计思想和实现机制,还能学习到如何编写高质量、可维护的代码。对于希望提升自身技能的Java开发者来说,深入研究Spring源代码是一项非常有价值的实践。

    spring 1.2源代码

    对于希望深入理解Spring框架或者进行框架开发的开发者来说,研究Spring 1.2源代码是一次宝贵的学习经历。这不仅能够提升你的编程技能,还有助于你更好地应用和优化Spring框架在实际项目中的使用。

    Spring最新源代码

    Spring框架是中国IT开发者广泛使用的Java企业级应用开发框架,它为构建高质量、可维护和可扩展的Java...通过研究Spring的源代码,你可以更深入地理解其工作原理,从而更好地利用这个强大的工具来构建高效的企业级应用。

    spring源代码下载地址

    本篇文章将详细探讨Spring框架的源代码及其下载过程,帮助开发者更好地理解和学习Spring。 首先,Spring源代码的下载对于深入理解其工作原理、自定义扩展或排查问题至关重要。在描述中提到的"Spring源代码的下载...

    spring原代码下载

    Spring 2.5版本是在2008年发布的,虽然现在已经有了更先进的版本,但2.5版仍然是许多项目的基础,理解其源码对于学习Spring的核心概念至关重要。 Spring框架的设计理念主要围绕依赖注入(Dependency Injection,DI...

    spring源代码解析

    这些文档详尽地揭示了Spring框架内部的工作原理,对于理解Spring的机制和优化项目开发具有极高的价值。通过对这些内容的学习,开发者不仅可以提高代码质量,还能更高效地利用Spring框架来解决实际问题。

    公司代码javaspring

    因此,对于这个"公司代码javaspring"的项目,深入理解和掌握Spring框架的各个组件和最佳实践至关重要。通过阅读和分析源代码,可以学习到如何在实际环境中应用这些技术,提升自己的Java和Spring开发能力。

    Spring入门经典源代码

    这个"Spring入门经典源代码"压缩包很可能是为了帮助初学者理解并学习Spring的基本概念和用法而准备的。 首先,Spring的核心是IoC(Inversion of Control)容器,它负责管理对象的生命周期和对象间的依赖关系。在...

    精通spring源代码精通spring源代码

    要精通Spring源代码,意味着深入理解其设计理念、核心组件以及工作原理。以下是对Spring框架主要知识点的详细阐述: 1. **IoC(Inversion of Control)容器**:Spring的核心在于它的依赖注入(DI)机制,它通过反转...

    pro spring3.0源代码

    《Pro Spring 3.0》是一本专注于Spring框架深度解析的书籍,其源代码提供了对Spring框架核心功能和设计理念的直观理解。Spring是Java企业级应用开发中的一个关键框架,它简化了创建、配置和管理Java应用程序的方式,...

Global site tag (gtag.js) - Google Analytics