Spring解析Locale的原理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring解析Locale的原理相关的知识,希望对你有一定的参考价值。
参考技术Aorg.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的原理的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis源码解析-mybatis-spring原理解析