前言
上一篇SpringBoot-2.1.3自动配置原理已经介绍了自动配置的大致过程,下面接着上篇的内容进一步介绍其过程,下面以HttpEncodingAutoConfiguration为例。
根据前一篇讲的,当获取到配置项的数据,也就是各个xxxAutoConfiguration类的全路径之后将会在容器中创建对象,下面是HttpEncodingAutoConfiguration源码。
@Configuration
@EnableConfigurationProperties({HttpProperties.class})
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
...
}
- @Configuration :声明该类为一个配置类,类似一个配置文件
- @EnableConfigurationProperties({HttpProperties.class}):
启动指定的类的@ConfigurationProperties功能,并且将配置文件中的配置信息与指定的类HttpProperties向绑定,并将该类导入容器; - @ConditionalOnWebApplication:判断当前应用是否为一个web应用,是则改配置类生效;@Conditional是Spring顶层注解,用来根据条件决定配置是否生效
- @ConditionalOnClass({CharacterEncodingFilter.class}):判断当前应用中存在指定的类时配置生效;
- @ConditionalOnProperty( prefix = “spring.http.encoding”,value = {“enabled”}, matchIfMissing = true):判断当前应用配置中是否存在"spring.http.encoding.enabled"配置,存在当前配置项生效;matchIfMissing = true表示即便没有前面的配置,配置项也生效;
HttpEncodingAutoConfiguration对象的创建依赖于其对应的属性类HttpProperties,下面再来看看HttpProperties.
@ConfigurationProperties(
prefix = "spring.http"
)
public class HttpProperties {
private boolean logRequestDetails;
private final HttpProperties.Encoding encoding = new HttpProperties.Encoding();
public HttpProperties() {
}
public boolean isLogRequestDetails() {
return this.logRequestDetails;
}
public void setLogRequestDetails(boolean logRequestDetails) {
this.logRequestDetails = logRequestDetails;
}
public HttpProperties.Encoding getEncoding() {
return this.encoding;
}
public static class Encoding {
public static final Charset DEFAULT_CHARSET;
private Charset charset;
private Boolean force;
private Boolean forceRequest;
private Boolean forceResponse;
private Map<Locale, Charset> mapping;
...
}
}
我们可以看到HttpProperties 内部有个静态内部类Encoding,这里面定义了编码相关的属性,这也就是我们可以进行设置和修改的。并且HttpProperties 对象创建时已经将Encoding作为其一个属性创建出来,所以我们在配置文件中使用编码的配置时,其书写格式就为:spring.http.encoding.enconding类的属性=xxx。
到此,SpringBoot的自动配置原理就介绍完了,其他的配置类分析过程类似。