`
meiyx
  • 浏览: 180860 次
  • 性别: 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官方网站下的。Spring源码是几个开源框架中写的最好的。如果想理解高手的编程风格,这个是最经典的了。建议有一定基础的朋友阅读。

    Spring源代码解析

    Spring源代码解析 深入理解Spring Aprxy Template Aop 事务处理 的用法

    深入理解Spring+Cloud与微服务构建源代码

    深入理解Spring+Cloud与微服务构建源代码,PDF网上资源多就不分享了。

    SpringCloud第二季周阳老师脑图和代码

    首先在这里感谢阳哥,让我加深了对SpringCLoud的理解,写到吐的案例是真的让我不慌微服务的代码了。 该项目中有我按照视频的内容总结的思维导图,基本和阳哥的那个差不多,同样是mmap格式的。 与视频不同的是,我在...

    Struts和Spring源代码包

    Struts和Spring源代码包,对于理解内部机制有很大作用哦

    理解Spring AOP实现与思想 案例代码

    博客《理解Spring AOP实现与思想》案例代码,对Java技术感兴趣的朋友可以关注一下我,我在csdn为您准备了很多Java干货。

    Spring框架的简单实现

    我们从一个简单的容器开始,一步步的重构,最后实现一个基本的Spring框架的雏形,为了帮助我们更加深入的理解Spring的IoC的原理和源码。 详细内容见博文: 【SSH进阶之路】一步步重构容器实现Spring框架——从一个...

    看透SpringMVC源代码分析与实践(扫描版)

     系统理解Spring MVC框架,为灵活开发高质量产品打下坚实基础。  深入理解Spring MVC的编程技巧和设计理念,提高综合思考、整体架构的能力。  学习作者自研的源代码分析方法——器用分析法,高效学习程序源代码。

    spring ioc+mvc代码

    自己实现的spring ioc+mvc框架,具体流程参考的spring,可以加深对spring源码流程的理解

    Spring基础学习代码

    我在学习Spring框架的时候,使用的一些简单代码来理解框架的基础使用!

    spring 原理与代码分析

    spring 代码分析,有助于理解和学习spring的精华。希望能给各位带来帮助。

    Spring MVC使用Demo

    可以了解spring mvc的开发环境,以及注解使用,对理解spring mvc的工作原理有直观的帮助。

    Spring3.1 入门代码

    这是在Spring的官方网站上的实例代码,适合初学者想入门Spring MVC的朋友。这里有源代码,操作步骤的教程文档。...不过要理解其内容你还必须学习Spring的一些基本知识,比如依赖注入,Annotation的基本概念等等。

    Spring MVC源码深度剖析开源架构源码2021.pdf

    Spring MVC源码深度剖析开源架构源码2021.pdf

    spring揭秘.pdf

    本人看过的最好的介绍Spring框架的书,有这一本书,可轻松理解Spring的核心概念Ioc,AOP,以及Spring的重要应用(Data,事务,SpringMVC等等)。极力推荐

    spring深度解析与解密

    对Spring源代码的理解,并非仅仅为了理解Spring的原理和设计,而是为了学习这些优秀的设计思想,让自己在工作中的设计更加出色。我几度去看设计模式,没有兴趣和毅力读下去,但是有了这些具体开源代码,才知道原理。

    spring事务管理几种方式代码实例

    spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...

    spring+springmvc+mybatisSSM框架整合示例代码

    三大框架的整合,示例代码,直接可以运行。完整的目录结构,一目了然,更好的学习spring+springmvc+mybatis框架的整合和理解。快速了解SSM架构

Global site tag (gtag.js) - Google Analytics