这里写目录标题
SpringBoot 中 localeResolver 的实现原理
WebMvcAutoConfiguration
类中
1、WebMvcAutoConfiguration
是SpringBoot中的 Web方面的自动配置类。
2、当用户没有创建自己的 localeResolver
时,这个配置方法就会生效,从而产生一个localeResolver
。(配置自己的localeResolver
时,Bean名必须为localeResolver
)。
3、spring.web.locale-resolver
、spring.mvc.locale-resolver
的配置属性都有两个值可供选择。(fixed
、accept_header
)。
4、选择属性值 fixed
,表示 Locale
区域对象是 固定的。
5、当属性值为fixed
,应该搭配spring.web.locale
、spring.mvc.locale
这两个配置属性一起使用,给出固定的Locale
区域对象。
6、假如属性值为fixed
,又没有搭配上面两个属性之一,则因为上面两个属性没有默认值,则Locale
区域对象将会使用运行主机的默认语言环境生成一个Locale
区域对象。
6、从以下的方法的执行流程可以看出,spring.web.locale-resolver
优先级比 spring.mvc.locale-resolver
高一些。
7、因为spring.web.locale-resolver
、spring.mvc.locale-resolver
它们的 默认值 都为 accept_header
,所以,只要不更改配置,默认就不是固定的Locale
区域对象。就会继续执行最下面的部分。
8、此时spring.web.locale
、spring.mvc.locale
这两个配置属性,假如存在,就会成为AcceptHeaderLocaleResolver
的默认的Locale
区域对象。 并在请求响应的请求头中没有Accept-Language
这个属性时,成为AcceptHeaderLocaleResolver
返回的Locale
区域对象。
9、AcceptHeaderLocaleResolver
会根据请求响应的请求头中的Accept-Language
属性,来返回特定的Locale
区域对象。
@Bean
@ConditionalOnMissingBean(
name = {
"localeResolver"} //假如SpringBoot中没有这个 localeResolver Bean,就加载这个自动配置Bean
)
public LocaleResolver localeResolver() {
//假如配置文件中有 spring.web.locale-resolver=fixed,就表示是固定的 Locale 配置
//(这个属性默认值为 ACCEPT_HEADER,WebProperties 类中)
if (this.webProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.WebProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.webProperties.getLocale());
//假如配置文件中有 spring.mvc.locale-resolver=fixed,就表示是固定的 Locale 配置
//(这个属性默认值为 ACCEPT_HEADER,WebMvcProperties 类中)
} else if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.mvcProperties.getLocale());
} else {
//使用请求对象的请求头中的Accept-Language属性来生成Locale
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
Locale locale = this.webProperties.getLocale() != null ? this.webProperties.getLocale() : this.mvcProperties.getLocale();
localeResolver.s