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

matches 方法的第二个 参数为 AnnotatedTypeMetadata,该接口提供了访问特定类或方法的注解功能 , 并且不需要加载类 , 可以用来检查带有@Bean 注解的方法上是否还有其他注解, AnnotatedTypeMetadata 接口定 义如下 。
public interface AnnotatedTypeMetadata {boolean isAnnotated(String annotationName);@NullableMap getAnnotat ionAttributes (String annotationName) ;@NullableMap getAnnotationAttributes (String annotat ionName, booleanclassValuesAsString);@NullableMultiValueMap getAllAnnotat ionAttributes (String annotationName);@NullableMultiValueMap getAllAnnotationAttributes (String annotationName,boolean classValuesAsString);}该接口的 isAnnotated 方法能够提供判断带有@Bean 注解的方法上是否还有其他注解的功能 。 其他方法提供不同形式的获取@Bean 注解的方法上其他注解的属性信息 。
条件注解的衍生注解
在 Spring Boot 的 autoconfigure 项目中提供了各类基于@Conditional 注解的衍生注解 , 它们适用不同的场景并提供了不同的功能 。 以下相关注解均位于 spring-boot-autoconfigure项目的 org.springframework.boot.autoconfigure.condition 包下 。
.@ConditionalOnBean: 在容器中有指定 Bean 的条件下 。
.@ConditionalOnClass: 在 classpath 类路径下有指定类的条件下 。
.@ConditionalOnCloudPlatform: 当指定的云平台处于 active 状态时 。
.@ConditionalOnExpression: 基于 SpEL 表达式的条件判断 。
.@ConditionalOnJawa:基于 JVM 版本作为判断条件 。
. @ConditionalOnJndi: 在 JNDI 存在的条件下查找指定的位置 。
.@ConditionalOnMissingBean:当容器里没有指定 Bean 的条件时 。
.@ConditionalOnMissingClass: 当类路径下没有指定类的条件时 。
.@ConditionalOnNotWebApplication: 在项目不是一个 Web 项目的条件下 。
. @ConditionalOnProperty: 在指定的属性有指定值的条件下 。
.@ConditionalOnResource: 类路径是否有指定的值 。
.@ConditionalOnSingleCandidate: 当指定的 Bean 在容器中只有一个或者有多个但是指定了首选的 Bean 时 。
.@ConditionalOnWebApplication:在项目是一个 Web 项目的条件下 。
如果仔细观察这些注解的源码 , 你会发现它们其实都组合了@Conditional 注解 , 不同之处是它们在注解中指定的条件( Condition)不同 。 下面我们以@ConditionalOnWebApplication为例来对衍生 条件注解进行一个简单的分析 。
@Target({ ElementType . TYPE , ElementType.METHOD })@Retent ion(RetentionPolicy . RUNTIME)@Documented@Condit ional (OnWebApplicat ionCondition. class)public @interface Condit iona lOnWebApplication {//所需的 web 应用类型Type type() default Type . ANY;//可选应用类型枚举enum Type {//任何类型ANY,//基于 servlet 的 web 应用SERVLET,//基 Freactive 的 web 应用REACTIVE}}@ConditionalOnWebApplication 注解的源代码中组合了@Conditional 注解 , 并且指定了对应的 Condition 为 OnWebApplicationCondition。
【SpringBoot内置http编码功能为例分析自动配置过程】OnWebApplicationCondition 类的结构与前面讲到的 OnClassCondition-样 , 都继承自SpringBootCondition 并 实 现 AutoConfigurationlmportFilter 接 口。关 于 实 现AutoConfigurationImportFilter 接口的 match 方法在前面已经讲解过 , 这里重点讲解关于继承 SpringBootCondition 和实现 Condition 接口的功能 。
图 2-6 展示了以 OnWebApplicationCondition 为例的衍生注解的关系结构 , 其中省略了之前章节讲过的 Filter 相关内容 , 重点描述了 Condition 的功能和方法 。


推荐阅读