springboot 初始化加载过程 条件注解

发布时间 2023-08-02 20:25:08作者: 花开如梦

官网解释:https://docs.spring.io/spring-boot/docs/3.0.9/reference/html/features.html#features.developing-auto-configuration.condition-annotations

从其他博客粘过来的表格:

条件注解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并替换它们吧!