Springmvc国际化自动配置代码实现
在springmvc中通过LocalResover获取区域信息对象Local(对语言信息、国家代码等的封装),进行国际化配置,在springboot为我们提供了默认的区域信息解析器
@Configuration( proxyBeanMethods=false ) @ConditionalOnWebApplication( type=Type.SERVLET ) @ConditionalOnClass({Servlet.class,DispatcherServlet.class,WebMvcConfigurer.class}) @ConditionalOnMissingBean({WebMvcConfigurationSupport.class}) @AutoConfigureOrder(-2147483638) @AutoConfigureAfter({DispatcherServletAutoConfiguration.class,TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class}) publicclassWebMvcAutoConfiguration{ publicstaticfinalStringDEFAULT_PREFIX=""; publicstaticfinalStringDEFAULT_SUFFIX=""; privatestaticfinalString[]SERVLET_LOCATIONS=newString[]{"/"}; @Bean @ConditionalOnMissingBean//容器中没有LocaleResolver时 @ConditionalOnProperty( prefix="spring.mvc", name={"locale"} ) publicLocaleResolverlocaleResolver(){//如果属性中指定用固定的就用固定的FixedLocaleResolver区域化信息解析器 if(this.mvcProperties.getLocaleResolver()==org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED){ returnnewFixedLocaleResolver(this.mvcProperties.getLocale()); }else{//否则使用AcceptHeaderLocaleResolver区域化信息解析器 AcceptHeaderLocaleResolverlocaleResolver=newAcceptHeaderLocaleResolver(); localeResolver.setDefaultLocale(this.mvcProperties.getLocale()); returnlocaleResolver; } }
AcceptHeaderLocaleResolver在request请求头中获取到区域信息
publicclassAcceptHeaderLocaleResolverimplementsLocaleResolver{ privatefinalListsupportedLocales=newArrayList(4); publicLocaleresolveLocale(HttpServletRequestrequest){ LocaledefaultLocale=this.getDefaultLocale(); if(defaultLocale!=null&&request.getHeader("Accept-Language")==null){ returndefaultLocale; }else{ LocalerequestLocale=request.getLocale(); List supportedLocales=this.getSupportedLocales(); if(!supportedLocales.isEmpty()&&!supportedLocales.contains(requestLocale)){ LocalesupportedLocale=this.findSupportedLocale(request,supportedLocales); if(supportedLocale!=null){ returnsupportedLocale; }else{ returndefaultLocale!=null?defaultLocale:requestLocale; } }else{ returnrequestLocale; } } }
默认就是更具请求头带来的区域信息获取Local进行国际化
我们可以通过定义自己的区域化解析器生成区域化信息
publicclassMyLocaleResolverimplementsLocaleResolver{ @Override publicLocaleresolveLocale(HttpServletRequestrequest){ Stringl=request.getParameter("l"); Localelocale=Locale.getDefault(); if(!StringUtils.isEmpty(l)){ String[]split=l.split("_"); locale=newLocale(split[0],split[1]); } returnlocale; } @Override publicvoidsetLocale(HttpServletRequestrequest,HttpServletResponseresponse,Localelocale){ } } @Configuration publicclassMyMvcConfigextendsWebMvcConfigurerAdapter{ @Bean publicLocaleResolverlocaleResolver(){ returnnewMyLocaleResolver(); } }
量变引起质变,这就是我所理解的因果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。