如何查看一个组件能够被配置的东西(不需要死记硬背)
查看任何一个配置类,都可以在xxxProperties中查找到可配置的项目(例子:WebMVCProperties.class)
点击进入类:
每一个成员变量都可以配置,@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传递来)
-
所以我们可以在链接上携带国际化区域信息
-
重写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) { } }
-
注意,在spring中自带的LocaleResolver仍然生效,但我们要让自己的LocaleResolver生效,我们可以注意到,spring中的LocaleResolver配置了一个注解
@ConditionalOnMissingBean
,当没有别的LocaleResolver Bean创建的时候才生效,我们要创建一个自己的Bean,并且返回LocaleResolver
在Config类中创建一个方法,定义为Bean,返回LocaleResolver到此国际化完成