开发者学堂课程【 SpringBoot 快速掌握 - 核心技术:@Congition& ;自动配置报告】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/612/detail/9232
@Congition& ;自动配置报告
内容介绍:
一、实操演示
二、细节
一、实操演示
@Configuration@FnableConfigurationProperties(HttpEncodingProperties.class)@Conditional0nwebApplication@Conditional0nclass(CharacterEhcodingFilter.class)GConditionalOnProperty(prefix F "spring.http.encoding"" value = "enabled" matchIfNissing = true)
//在用户进行自动配置时有一个很重要的环节,如果想要自动配置项生效,那么就要根据 configuration 判断来,判断成功,则自动配置生效。@Bean@conditionalOnMissingBean(CharacterEncodingFilter.class)public CharacterEncodingFiltetcharacterEncodingFilter(){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 添加的,这时也存在条件判断( @conditionalOnMissingBean ),此时的要求时容器重必须没有 MissingBean 才行,只有当容器中没有这个组件时,添加的组件才能够生效。其中 conditionalOn 是通过 spring 的底层注解 @Conditional 来实现的,注解后面的参数是条件类 conditional ( onclassCondition.class ) ,点击 onclassCondition.class 可查看条件判断类的具体信息。public boolean[] match ( String[] autoConfigurationClasses ,进入后可发现这里有一个 match 方法,使用者也可以在此书写自己的 Java 代码;匹配了返回 true ,匹配不成功则返回 false 。返回 false 也就意味着判断失败。
二,细节
1、 @Conditional 派生注解( Spring 注解版原生的 @Conditional 作用)
作用:必须是 @Conditional 指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;
Conditional 扩展注解 |
作用(判断是否满足当前指定条件) |
@ConditionalOnJava |
系统的 java 版本是否符合要求 |
@ConditionalOnBean |
容器中存在指定 Bean ; |
ConditionalOnMissingBean |
容器中不存在指定 Bean ; |
ConditionalOnExpression |
满足 SpEL 表达式指定 |
@ConditionalOnClass |
系统中有指定的类 |
@ConditionalOnMissingClass |
系统中没有指定的类 |
ConditionalOnSingleCandidate |
容器中只有一个指定的 Bean ,或者这个Bean是首选 Bean |
@ConditionalOnProperty |
系统中指定的属性是否有指定的值 |
@ConditionalOnResource |
类路径下是否存在指定资源文件 |
@ConditionalOnWebApplication |
当前是web环境 |
ConditionalOnNotWebApplication |
当前不是web环境 |
@ConditionalOnJndi |
JNDI存在指定项 |
//其中 @ConditionalOnJava 用于检查系统的java版本是否符合要求,看是否是用户所需要的版本; @ConditionalOnBean 用于判断容器中是否存在指定的组件,比如用户在配置 CharacterEncodingFiltet 时 @conditionalOnMissingBean 这个注解,这里的 MissingBean 是用于判断容器是否存在该组件,判断成功则添加组件,判断失败则不添加组件。与之对应的是 @ConditionalOnBean 意为容器中不存在指定 Bean ; ConditionalOnExpression 用于判断是否满足SpEL表达式指定; @ConditionalOnClass 也是同样的道理,用于判断容器中是否存在系统指定的类,没有才加,有就不加; @ConditionalOnMissingClass 注解用于判断系统中没有指定的类; @ConditionalOnProperty 注解用于判断配置文件中是否存在指定的属性,没有会自动添加。