简要说明
@Conditional注解来源于org.springframework.context.annotation包中,也就是它是Spring中的注解,并不是SpringBoot的注解,他的作用是为了bean的装载到容器中增加一个条件判断,在满足条件下才会装载到容器中,这个条件的实现我们可以进行自定义的。
它存在很多扩展注解(SpringBoot对conditional注解的扩展),如下:
-
@ConditionalOnBean
-
@ConditionalOnProperty
-
@ConditionalOnClass
-
@ConditionalOnMissingBean
-
@ConditionalOnMissingClass
-
@ConditionalOnExpression
-
。。。。
以上的注解均来自org.springframework.boot.autoconfigure.condition包中,即都是springboot进行扩展的注解
自定义加载条件类
1.创建自定义bean加载条件的类,并实现Condition接口,重写matches方法
public class OnXXXXXCondition implements Condition{@Overridepublic final boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {。。。。。。}
}
2.在需要添加条件加载的类或者方法是使用@Conditional注解,并将自定义加载条件类作为参数加入到@Conditional中
@Conditional(OnXXXXXCondition.class)
public @interface ConditionalOnXXXX {.....
}
SpringBoot相关注解详解
@ConditionalOnProperty(重)
这个注解在使用场景中是频繁和重要的,如我们自定义springboot的Starter时,增加对该组件开关的配置信息等。
@Configuration
@ConditionalOnProperty(value="xxx.yyy",havingValue="true",matchIfMissing="ture")
public class TestBean{...
}
这个条件解释是: application.properties 或 application.yml 文件中 xxx.yyy 为 true 才会加载 TestBean 这个 Bean,如果没有匹配上也会加载,因为 matchIfMissing = true,默认值是 false,通常设置为false。
@ConditionalOnBean 和 ConditionalOnMissingBean
有时候我们需要某个 Bean 已经存在应用上下文时才会加载,那么我们会用到 @ConditionalOnBean`注解,
@Configuration
@ConditionalOnBean(OtherBean.class)
public class TestBean{...
}
反之有时候我们需要某个 Bean 不存在于应用上下文时才会加载,那么我们会用到@ConditionalOnMissingBean 注解。
@ConditionalOnClass 和 @ConditionalOnMissingClass
和上一个用法一致,只不过判断某个类是否存在于 classpath 中作为加载条件,@ConditionalOnClass判断存在, @ConditionalOnMissingClass判断不存在。
@ConditionalOnExpression
如果我们有更复杂的多个配置属性一起判断,那么我们就可以用这个表达式了:
@Configuration
@ConditionalOnExpression("${xxx.yyy:ture} and ${zzz.kkk}:ture")
public class TestBean{...
}
只有当两个属性都为 true 的时候才加载
。。。。