从其他博客粘过来的表格:
条件注解 | Condition处理类 | 实例 | 解释 |
---|---|---|---|
@ConditionalOnBean | OnBeanCondition | @ConditionalOnBean(DataSource.class) | Spring容器中不存在对应的实例生效 |
@ConditionalOnMissingBean | OnBeanCondition | @ConditionalOnMissingBean(name = "redisTemplate") | Spring容器中不存在对应的实例生效 |
@ConditionalOnSingleCandidate | OnBeanCondition | @ConditionalOnSingleCandidate(FilteringNotifier.class) |
Spring容器中是否存在且只存在一个对应的实例, 或者虽然有多个但 是指定首选的Bean生效 |
@ConditionalOnClass | OnClassCondition | @ConditionalOnClass(RedisOperations.class) | 类加载器中存在对应的类生效 |
@ConditionalOnMissingClass | OnClassCondition | @ConditionalOnMissingClass(RedisOperations.class) | 类加载器中不存在对应的类生效 |
@ConditionalOnExpression | OnExpressionCondition | @ConditionalOnExpression(“’${server.host}’==’localhost’”) | 判断SpEL 表达式成立生效 |
@ConditionalOnJava | OnJavaCondition | @ConditionalOnJava(JavaVersion.EIGHT) | 指定Java版本符合要求生效 |
@ConditionalOnProperty | OnPropertyCondition |
@ConditionalOnProperty(prefix = “spring.aop”, name = “auto”, havingValue = “true”, matchIfMissing = true) |
应用环境中的属性满足条件生效 |
@ConditionalOnResource | OnResourceCondition | @ConditionalOnResource(resources=”mybatis.xml”) | 存在指定的资源文件生效 |
@ConditionalOnWebApplication | OnWebApplicationCondition | 当前应用是Web应用生效 | |
@ConditionalOnNotWebApplication | OnWebApplicationCondition | 当前应用不是Web应用生效 |
上面的扩展注解我们可以简单的分为以下几类:
- Bean作为条件:@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnSingleCandidate。
- 类作为条件:@ConditionalOnClass、@ConditionalOnMissingClass。
- SpEL表达式作为条件:@ConditionalOnExpression。
- JAVA版本作为条件: @ConditionalOnJava
- 配置属性作为条件:@ConditionalOnProperty。
- 资源文件作为条件:@ConditionalOnResource。
- 是否Web应用作为判断条件:@ConditionalOnWebApplication、@ConditionalOnNotWebApplication。
以上是理解springboot默认加载的基础。
1.
2.
3.
4.
5.
6.
7.截图放不下了,最终会指向 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
8. imports 局部截图。这里包含了springboot想为你加载的所有模块的 *AutoConfiguration
9.当然,这些自动配置类并不是全部都会用到,会经过筛选处理
10.现在我们看一下 WebMvcAutoConfiguration.. 如果满足这三个条件。就不会过滤掉,看看上面的筛选条件。
11.看看WebMvcAutoConfiguration 做了什么。 根据条件注解,看看加载 Bean的条件,。思考如何定义自己的 bean并替换它们吧!