概述
spring
的ioc
极大的方便了日常开发,但随着业务的迭代。配置的一些参数在某些情况下需要按条件注入。
比如原先定义的db公共模块
下,相关的配置和工具类只是基于mysql
的。但是后续有模块需要使用mongo/es
等其他数据库,又想继续使用db公共模块
下的一些类。
那么这时候就希望db公共模块
下可以根据classpath
下的相关驱动class是否存在
来自动注入相关类。
@Condition
注解就能解决这个问题。这个注解是spring
的
org.springframework.context.annotation.Conditional
springboot
的核心是习惯优于配置,所有现成的实现了一堆@Conditionxxxx
注解,比如
org.springframework.boot.autoconfigure.condition.ConditionalOnBean
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
@Condition
进到这个注解的源码中一看,发现核心是org.springframework.context.annotation.Condition
接口,里面就一个matches
方法,返回true/false
.
意思也很简单,true
就是符合条件会被spring加载到ioc容器中
,false
则不会.
matches
方法的入参org.springframework.context.annotation.ConditionContext
中可以拿到很多有用的信息
springboot内置现成的Condition实现类封装的注解
@ConditionalOnSingleCandidate
当给定类型的bean
存在并且指定为Primary
的给定类型存在时,返回true
@ConditionalOnMissingBean
当给定的类型、类名、注解、昵称在beanFactory
中不存在时返回true
.各类型间是or
的关系@ConditionalOnBean
与上面相反,要求bean
存在@ConditionalOnMissingClass
当给定的类名在类路径上不存在时返回true
,各类型间是and
的关系@ConditionalOnClass
与上面相反,要求类存在@ConditionalOnCloudPlatform
当所配置的CloudPlatform
为激活时返回true
@ConditionalOnExpression
spel
表达式执行为true
@ConditionalOnJava
运行时的java版本号是否包含给定的版本号.如果包含,返回匹配,否则,返回不匹配@ConditionalOnProperty
要求配置属性匹配条件@ConditionalOnJndi
给定的jndi
的Location
必须存在一个.否则,返回不匹配@ConditionalOnNotWebApplication
web
环境不存在时@ConditionalOnWebApplication
web
环境存在时@ConditionalOnResource
要求制定的资源存在