Spring解析Locale的原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring解析Locale的原理相关的知识,希望对你有一定的参考价值。

参考技术A

    org.springframework.context.i18n.LocaleContext是一个接口,只有一个方法getLocale(),就是用来获取当前的Locale的,下面看下整体类图。

    从类图中,我们可以看到LocaleContext有三个子类:其中TimeZoneAwareLocaleContext是一个子接口,该接口提供了一个getTimeZone()方法来获取当前时区了;SimepleLocaleContext是对LocaleContext接口的一个简单实现;主要看下SimpleTimeZoneAwareLocaleContext类,这个类继承了SimpleLocaleContext,实现了TimeZoneAwareLocaleContext接口,这也就说该类可以同时获取Locale和TimeZone,这个类也是我们常用的,看下他的实现:

     整个LocaleContext的设计目的是为了保存了整个应用的Locale和TimeZone。看完下面的LocaleResolver,你就会明白LocaleContext的作用。

    首先看下org.springframework.web.servlet.LocaleResolver的整体类图:

    上面这个类图中有两个主要的接口:org.springframework.web.servlet.LocaleResolver和org.springframework.web.servlet.LocaleContextResolver,这两个接口的设计思想和上面的LocaleContext与TimeZoneLocaleContext是一致的。LocaleResolver接口提供了对Locale操作的两个方法:

    LocaleContextResolver提供了对LocaleContext的两个操作方法:

    从上面的类图中,我们可以看到主要有四个实现类:
    1.org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
        该实现类相当于LocaleResolver的默认实现,由于它只实现了LocaleResolver接口,因此只能解析Locale,不能设置Locale,该类在DispatcherServlet调用initLocaleResolver()方法的时候,会判断IOC容器中是由有一个叫localeResolver的Bean,如果这个Bean不存在,就会初始化该类作为默认的LocaleResolver。这个类是通过判断HTTP Header中的Accept-Language字段的值来决定当前应用的Locale和TimeZone。

    2.org.springframework.web.servlet.i18n.CookieLocaleResolver
        该类是通过应用设置的Cookie来判断当前需要的Locale的,我们只需要给定CookieName,它会自动读取对应的value,设置Locale。

    3.org.springframework.web.servlet.i18nSessionLocaleResolver
        由名字可知,该类是通过设置Session来实现的,实现原理和CookieLocaleResolver大差不差。

    4.org.springframework.web.servlet.i18n.FixLocaleResolver
        该类从名字就可以知道是一个固定的LocaleResolver,也就是说该类一旦设置了默认的Locale和TimeZone,就不可更改,更改会抛出异常。

     总结一下,常用的是CookieLocaleResolver和SessionLocaleResolver。LocaleResolver的初始化是在DispatcherServlet的initLocaleResolver方法中进行的。
无论是使用哪个实现类,Bean的id一定要申明为localeResolver,否则DIspatcherServlet读取不到,将会初始化默认的AcceptHeaderLocaleResolver。

    其他相关文章:
         java原生国际化
         Spring国际化使用教程
         Spring国际化消息解析原理

以上是关于Spring解析Locale的原理的主要内容,如果未能解决你的问题,请参考以下文章

spring国际化locale的代码原理以及拓展配置

InheritableThreadLocal原理解析

Mybatis源码解析-mybatis-spring原理解析

Spring MVC工作原理及源码解析 ViewResolver实现原理及源码解析

Spring Cloud Ribbon原理解析

spring源码解析--事件监听机制的使用和原理解析