个人笔记,因有道需要会员,就用CSDN了,本人菜鸟,欢迎批评。
全篇摘抄SpringBoot 技术内幕:架构设计与实现原理。
在常规的Web项目中该配置位于web.xml,通过来进行配置。
而在Spring Boot中通过内置的HttpEncodingAutoConfiguration来完成这一功能。下面我们具体分析一下该功能都涉及哪些配置和实现。根据前面讲的操作流程,我们先来看一下META-INF/spring.factories中对该自动配置的注册。
当完成注册之后,在加载的过程中会使用元数据的配置进行过滤,对应的配置内容在META-INF/spring-autoconfigure-metadata.properties文件中
@Configuration
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
private final HttpProperties.Encoding properties;
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
@Bean
@ConditionalOnMissingBean
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 WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>, Ordered {
private final HttpProperties.Encoding properties;
LocaleCharsetMappingsCustomizer(HttpProperties.Encoding properties) {
this.properties = properties;
}
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
if (this.properties.getMapping() != null) {
factory.setLocaleCharsetMappings(this.properties.getMapping());
}
}
@Override
public int getOrder() {
return 0;
}
}
}
很明显,它被@ConditionalOnClass注解,并且指定实例化的条件为类路径下必须有CharacterEncodingFilter存在。再看一下该类的其他注解。
- @Configuration:指定该类作为配置项来进行实例化操作。
- @EnableConfigurationProperties:参数为HttpProperties.class,开启属性注入,会将参数中的HttpProperties注入该类。
- @ConditionalOnWebApplication:参数为Type.SERVLET,说明该类只有在基于servlet的Web应用中才会被实例化。
- @ConditionalOnWebApplication:参数为Type.SERVLET,说明该类只有在基于servlet的Web应用中才会被实例化。
- @ConditionalOnClass:参数为CharacterEncodingFilter.class,只有该参数存在,才会被实例化。
- @ConditionalOnMissingBean:注释于方法上,与@Bean配合,当容器中没有该Bean的实例化对象时才会进行实例化。