Springboot自动配置和自定义LocaleResolver(解析用户区域)

一、概述
在项目开发过程中,可能会针对不同的国家的用户提供不同的视图,如针对日本用户提供一个视图,针对中国用户提供一个视图,这时候就需提供在同个页面上,能切换不同的语言,而LocaleResolver能够帮我们实现这种切换。

二、LocaleResolver的概述
LocaleResolver是spring提供的一个接口

public interface LocaleResolver {
       //根据request请求获取locale
    Locale resolveLocale(HttpServletRequest var1);
     //设置lacale的样式
    void setLocale(HttpServletRequest var1, @Nullable HttpServletResponse var2, @Nullable Locale var3);
}

三、LocaleResolver的自动配置

Springboot中WebMvcAutoConfiguration自动配置了 LocaleResolver,spring.mvc.locale可以配置localeResolver的属性值,不配置的话选择默认,即根据系统的语言返回页面显示

@Bean
		@ConditionalOnMissingBean
		@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
		public LocaleResolver localeResolver() {
			if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
				return new FixedLocaleResolver(this.mvcProperties.getLocale());
			}
			AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
			//获取默认的locale
			localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
			return localeResolver;

四、自定义LocaleResolver

当我们需要实现国际化时,则要创建 localeResolver的实现类,(实现类会让SpringBoot中自动配置的 localeResolver失效),同时实现接口的方法

public class MyLocaleResolver implements LocaleResolver {

    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
    //获取前端传来的数据
        String l = httpServletRequest.getParameter("l");
        Locale locale = Locale.getDefault();
        if (l != null && l.length() > 0) {
            String[] split = l.split("_");
           locale= new Locale(split[0], split[1]);
        }
        return locale;
    }

//Locale的构造方法,参数1:语言,参数2:国家
  public Locale(String language, String country) {
        this(language, country, "");
    }
 

注入ioc容器中,交由spring来管理

   @Bean
    public LocaleResolver localeResolver(){
        return  new MyLocaleResolver();
    }

此时,需要指定 LocaleResolver映射文件的属性, MessageSourceAutoConfiguration中的spring.message映射 LocaleResolver文件的位置

public class MessageSourceAutoConfiguration {

	private static final Resource[] NO_RESOURCES = {};
	@Bean                             //映射文件的属性
	@ConfigurationProperties(prefix = "spring.messages")
	public MessageSourceProperties messageSourceProperties() {
		return new MessageSourceProperties();
	}
	
	@Override
		public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
		                                                       //在application.properties下映射此配置文件的位置
			String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");
			ConditionOutcome outcome = cache.get(basename);
			if (outcome == null) {
				outcome = getMatchOutcomeForBasename(context, basename);
				cache.put(basename, outcome);
			}

application.properties配置文件
spring.messages.basename=i18n/index
在这里插入图片描述

index中定义了不同的语言

根据local里面的数据,来匹配对应的properties文件,找到对应的文件后,交给Springboot来处理,响应到页面上

五、总结
Springboot自定配置LocaleResolver,如果需要自定义,则要继承LocaleResolver接口,同时注入IOC容器中(参照Spirngboot自动配置LocaleResolver),配好映射文件的位置和属性,接下来springboot就会自动帮我们把数据响应给页面。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个快速开发框架,它提供了许多方便的功能,包括自定义注解和自定义解析器。下面将分别介绍这两个功能。 自定义注解可以在Spring Boot应用中定义特定的标记,然后通过注解处理器对标记的领域和实现逻辑进行解析和处理。通过自定义注解,我们可以在代码中添加特定的注解标记,然后通过自定义解析器将标记的信息提取出来,并根据标记的信息完成相应的操作。 例如,我们可以定义一个自定义注解@Inject,用于标记需要自动注入的对象。然后,我们可以使用自定义解析解析这个注解,并根据注解的信息完成对象的自动注入操作。 自定义解析器可以实现一些自定义逻辑,用来解析注解并执行相应的操作。在Spring Boot中,我们可以通过使用反射机制获取类的字段信息,然后根据字段上的注解信息进行对象的自动注入。 在自定义解析器中,我们可以遍历类的字段,判断字段上是否存在我们定义的注解。如果存在注解,则根据注解的信息创建相应的对象,并将其注入到目标字段中。 通过自定义注解和自定义解析器,我们可以实现对象的自动注入操作,从而简化了代码的编写和维护,提高了开发效率。 总结:Spring Boot提供了自定义注解和自定义解析器的功能,通过这两个功能,我们可以在应用中实现对象的自动注入操作,从而简化了代码的编写和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值