SpringBoot开发【配置】@Conditional&自动配置报告

294 阅读3分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。

我们上一次学习了SpringBoot的自动配置原理,我们会发现在自动配置之前有一些判断条件,这些判断条件判断成功之后,自动配置才能够生效。这些判断均为@ConditionOnxxxxx,其底层都是用注解@Conditional做的,我们就来学习一下这个注解

@Conditional

我们先来找一下底层文件,还是上一次用的HttpEncodingAutoConfiguration文件,随便进入其中的一个判断,例如@ConditionalOnClass 进入然后我们就会发现@Conditional,后边指定了一个条件判断类,OnClassCondition.class,点进去里面会有很多判断语句,这些语句判断成功了,才能返回去执行自动配置功能 下面是@Conditional的扩展注解

@ConditionalOnBean:仅仅在当前上下文中存在某个对象时,才会实例化一个Bean @ConditionalOnClass:某个class位于类路径上,才会实例化一个Bean @ConditionalOnExpression:当表达式为true的时候,才会实例化一个Bean @ConditionalOnMissingBean:仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean @ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个Bean @ConditionalOnNotWebApplication:不是web应用,才会实例化一个Bean @ConditionalOnBean:当容器中有指定Bean的条件下进行实例化 @ConditionalOnMissingBean:当容器里没有指定Bean的条件下进行实例化 @ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化 @ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化 @ConditionalOnWebApplication:当项目是一个Web项目时进行实例化 @ConditionalOnNotWebApplication:当项目不是一个Web项目时进行实例化 @ConditionalOnProperty:当指定的属性有指定的值时进行实例化 @ConditionalOnExpression:基于SpEL表达式的条件判断 @ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化 @ConditionalOnResource:当类路径下有指定的资源时触发实例化 @ConditionalOnJndi:在JNDI存在的条件下触发实例化 @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化

自动配置类必须在一定的条件下才能生效

我们可以通过查看配置类文件了解哪些自动配置类可以生效,但是这样很麻烦,有一个简单的方法 我们可以通过启用debug=ture属性,让控制台打印自动配置报告。在自动报告中我们就可以看到哪些自动配置类生效 我们给配置文件加debug=ture

#开启springboot的debug
debug=ture

运行一下

自动配置报告

自动配置报告其中Postive matches为启用的自动配置类,Negitive matches没有启用的自动配置 通过这些报告,我们就能知道哪些为自动配置类了

以上就是@Condtional和自动配置报告文件了