`
meiyx
  • 浏览: 181352 次
  • 性别: 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网上资源多就不分享了。

    Struts和Spring源代码包

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

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

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

    理解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选择题(含答案).doc

    Spring 框架选择题解析 Spring 框架是一种流行的 Java 应用程序框架,提供了许多强大的功能,...本文涵盖了 Spring 框架的基本概念,例如依赖注入、面向切面编程等,旨在帮助读者更好地理解 Spring 框架的原理和应用。

    Spring基础学习代码

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

    spring 原理与代码分析

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

    Spring MVC使用Demo

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

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

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

    Spring3.1 入门代码

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

    spring揭秘.pdf

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

    spring深度解析与解密

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

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

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

Global site tag (gtag.js) - Google Analytics