视频地址: https://www.bilibili.com/video/BV1yr4y1w7ia
代码仓库: https://gitee.com/crazyliyang/video-teaching
我们以 HttpEncodingAutoConfiguration 来进行说明讲解
在 spring-boot-autoconfigure 项目的 META-INF/spring.factories 文件中
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
.
.
.
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
.
.
.
案例类: HttpEncodingAutoConfiguration
@Configuration
@EnableConfigurationProperties(HttpEncodingProperties.class) // 指定的HttpEncodingProperties 配置类,
// 属性值加载配置文件对应的值,进行赋值
@ConditionalOnWebApplication // 条件注解 当前是web 应用
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
// 配置文件中 spring.http.encoding: enabled 如果没有,也会生效
public class HttpEncodingAutoConfiguration {
private final HttpEncodingProperties properties;
// 构造方法注入
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}
@Bean
@ConditionalOnMissingBean(CharacterEncodingFilter.class) // 缺少当前Bean时生效
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
@Bean
public LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
return new LocaleCharsetMappingsCustomizer(this.properties);
}
private static class LocaleCharsetMappingsCustomizer
implements EmbeddedServletContainerCustomizer, Ordered {
private final HttpEncodingProperties properties;
LocaleCharsetMappingsCustomizer(HttpEncodingProperties properties) {
this.properties = properties;
}
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (this.properties.getMapping() != null) {
container.setLocaleCharsetMappings(this.properties.getMapping());
}
}
@Override
public int getOrder() {
return 0;
}
}
}
注意看代码中的注释