SpringBoot配置相关

如何查看一个组件能够被配置的东西(不需要死记硬背)

查看任何一个配置类,都可以在xxxProperties中查找到可配置的项目(例子:WebMVCProperties.class)image

点击进入类:image

每一个成员变量都可以配置,@ConfigurationProperties(profix = "spring.mvc")中 profix = "spring.mvc" 是配置文件properties或yaml中的前缀,后面跟着你要自己修改的属性,例如:spring.mvc.messageCodeResolverFormat = xxx
并且以后引入的其他依中间件等,都可以找对应的properties来看那些属性能够被我们在.properties或者.yaml中配置。

配置文件属性值注入

使用@ConfigurationProperties注入属性

在类的前方要使用@ConfigurationProperties(prefix = "xxx")来进行注解,同时还要加上@Component注解来讲类进行自动装配,装配为SpringBean
这样,yaml或者properties配置文件中对应的xxx中的属性就会被映射到所被注解的类中的属性中。

@Component  //标注一个类为Spring容器的Bean
@@ConfigurationProperties(prefix = "person")  //将配置文件中的person的属性映射到类的属性中
public class Person {
    private int id ;
    //下面是属性的set方法
    ...
}

使用@value来进行注解

在每一个成员变量前加上@value()来进行属性映射

@Component
public class Person{
    @Value("${person.id}")  //使用EL表达式来对应到配置文件中的person.id
    private int id ;

}

注意:当一个类中有另一个类,如person类中包含一个成员变量为dog,dog是一个类,那么,person类使用@Component进行装配前要保证dog类也要被装配,否则后期自动注入报错!下面为示例代码:

Person:

@ConfigurationProperties(prefix = "person")
@Data
@Component
@Validated    //引入JSR303数据校验规则
public class Person {

    private String name;
    private Date birth;
    private Map<String,Object> map;
    private boolean happy;
//   注意!!!这里的Dog类也需要被注册为SpringBean(添加@Component)后期Person类才能被自动装配。
    private Dog dog;
}

Dog:

@Component
@Data
public class Dog {
    private String name;
    private int age;

}

国际化原理及配置

原理

SpringBoot中WebMVCAutoConfiguration.class中方法LocaleResolver(地域解析器),可以解析消息头中的地区信息

@Bean
        // 这个注解表示只有当Spring上下文中没有其他类型的LocaleResolver bean时,这个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接口,其中resolveLocale方法完成从request中接受locale
			AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
			localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
			return localeResolver;
		}

AcceptHeaderLocaleResolver类中的resolveLocale方法

public Locale resolveLocale(HttpServletRequest request) {
        Locale defaultLocale = this.getDefaultLocale();
        if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
            return defaultLocale;
        } else {
            Locale requestLocale = request.getLocale();
            List<Locale> supportedLocales = this.getSupportedLocales();
            if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) {
                Locale supportedLocale = this.findSupportedLocale(request, supportedLocales);
                if (supportedLocale != null) {
                    return supportedLocale;
                } else {
                    return defaultLocale != null ? defaultLocale : requestLocale;
                }
            } else {
                return requestLocale;
            }
        }
    }

Spring通过此方法解析当前地址,我们要做的就是重新实现LocaleResolver接口实现接受消息传递来的语言代码,然后重新new 一个Locale,这个Locale中包含着当前地区标识符
让我们自己来解析用户Locale(一般通过URL传递来)

  1. 所以我们可以在链接上携带国际化区域信息image

  2. 重写LocaleResolver接口中的resolveLocale方法

    public class localeResovler implements LocaleResolver {
         @Override
         public Locale resolveLocale(HttpServletRequest httpServletRequest) {
             String l= httpServletRequest.getParameter("l");
             Locale locale=null;
     //        不为空就设置更改后的地区信息,为空就用默认的信息
             if(!l.isEmpty()){
                 String[] s=l.split("_");
                 //System.out.println(s[0]);
                 //System.out.println(s[1]);
                 locale=new Locale(s[0],s[1]);
             }else {
                 locale=Locale.getDefault();
             }
             return locale;
         }
    
         @Override
         public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
    
         }
     }
  3. 注意,在spring中自带的LocaleResolver仍然生效,但我们要让自己的LocaleResolver生效,我们可以注意到,spring中的LocaleResolver配置了一个注解@ConditionalOnMissingBean,当没有别的LocaleResolver Bean创建的时候才生效,我们要创建一个自己的Bean,并且返回LocaleResolver
    在Config类中创建一个方法,定义为Bean,返回LocaleResolverimage

    到此国际化完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值