SpringBoot内置http编码功能为例分析自动配置过程( 四 )

首 先 在 isWebApplication 方 法 中 讲 行 Web 应用类型的推断。这 里 使 用AnnotatedTypeMetadata 的 getAnnotationAttributes 方 法 获 取 所 有 关 于@ConditionalOnWebApplication 的注解属性 。 返回值为 null 说明未配置任何属性 , 默认为Type.ANY,如果配置属性 , 会获得 type 属性对应的值 。
如果返回值为 Type.SERVLET,调用 isServletWebApplication 方 法来进行判断 。 该方法的判断有以下条件 。
:GenericWebApplicationContext 类是否在类路径下 。
.容器内是否存在注册名称为 session 的 scope 。
.容器的 Environment 是否为 ConfigurableWebEnvironment 。
.容器的 ResourceLoader 是否为 WebApplicationContext.
在完成了以上判断之后 , 得出的最终结果封装为 ConditionOutcome 对象返回 , 并在抽象类SpringBootCondition 的 matches 方法中完成判断 ,返回最终结果 。
实例解析在了解整个 Spring Boot 的运作原理之后 , 我们以 Spring Boot 内置的 http 编码功能为例 , 分析一下整个自动配置的过程 。
在常规的 Web 项目中该配置位于 web .xml,通过来进行配置 。
在常规的 Web 项目中该配置位于 web.xml,通过来进行配置 。
encodingFilterorg . springframework. web. filter . CharacterEncodingFilter encodingUTF - 8 forceEncoding< / param- name>true而在 Spring Boot 中通过内置的 HttpEncodingAutoConfiguration 来完成这一功能 。下面我们具体分析一下该功能都涉及哪些配置和实现 。
根据前面讲的操作流程 , 我们先来看一下 META-INF/spring.factories 中对该自动配置的注册 。
# Auto Configureorg. springframework. boot . autoconfigure . EnableAutoConfiguration=\org. springframework . boot . autoconfigure .web . servlet . HttpEncodingAutoConfiguration,\当完成注册之后 , 在加载的过程中会使用元数据的配置进行过滤 , 对应的配置内容在META-INF/spring-autoconfigure-metadata.properties 文件中 。
org. springframework. boot . autoconfigure . web. servlet .HttpEncodingAutoConfigur
ation. Conditional0nClass=org . springfr amework . web. filter. CharacterEncodingFilter
在 过 滤 的 过 程 中 要 判 断 自 动 配 置 类 HttpEncodingAutoConfiguration 是 否 被@ConditionalOnClass 注解 , 源代码如下 。
@Configuration@EnableConfigurat ionProperties (HttpProperties.class)@ConditionalOnWebApplication(type = ConditionalOnWebApplication. Type . SERVLE@Conditional0nClass (CharacterEncodingFilter . class)@ConditionalOnProperty(prefix = "spring. http. encoding", value = "http://kandian.youth.cn/index/enabled" ,matchIfMissing = true)public class HttpEncodingAutoConfiguration {private final HttpProperties . Encoding properties ;public HttpEncodingAutoConf igurat ion(HttpProperties properties) {this. properties = properties. getEncoding();@Bean@ConditionalOnMissingBeanpublic 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;}}


推荐阅读