Spring条件注解@Conditional,SpringBoot中组合条件你知道吗?

导读:当咱们构建一个 Spring 应用的时候,有时咱们想在知足指定条件的时候才将某个 bean 加载到应用上下文中, Spring 4提供了一个更通用的基于条件的Bean的建立方式,即便用@Conditional注解,咱们能够经过 @Conditional 注解来实现这类操做。web

@Conditional 元注解源码

图片

图片

Conditional 接口源码

咱们看到 @Conditional 注解接收的参数是 extends Condition 接口的泛型类,也就是说,咱们要使用 @Conditional 注解,只须要实现 Condition 接口并重写其方法便可:spring

图片

图片

简单找下Spring家族其余的案例实现SpringBootConditionmarkdown

图片

图片

Spring Boot使用的全部Condition实现的基础。提供合理的日志记录,以帮助用户诊断要加载的类。oop

无心中在网上看到一种比较形象的理解:若是将Application Context 比做大厅,Spring Boot 在 @Conditional 注解的基础上进行了细化,无需出示复杂的介绍信 (实现 Condition 接口),只须要手持预约义好的 @ConditionalOnXxxx 注解印章的门票,若是验证经过,就会走进 Application Context 大厅学习

SpringBoot Condition 拓展实现spa

图片

逐个打开这 13 个注解,咱们发现这些注解上有相同的元注解设计

图片

从这些标记上咱们能够了解以下内容:日志

  • 均可以应用在 TYPE 上,也就是说,Spring 自动扫描的一切类 (@Configuration, @Component, @Service, @Repository, or @Controller) 均可以经过添加相应的 @ConditionalOnXxxx 来判断是否加载code

  • 均可以应用在 METHOD 上,因此有 @Bean 标记的方法也能够应用这些注解orm

  • 都是用了 @Conditional 注解来标记,OnBeanCondition 等自定义 Condition 仍是实现了 Condition 接口的,换汤不换药,没什么神秘的,只不过作了更具象的封装罢了,来看类依赖图(简化的类图)

图片

其实用法都大同小异,看了源码之后发现原理很简单,这里简单概括下用法:

除了本身自定义Condition以外,Spring还提供了不少Condition给咱们用

  • @ConditionalOnBean

    仅仅在当前上下文中存在某个对象时,才会实例化一个Bean

  • @ConditionalOnClass

    某个class位于类路径上,才会实例化一个Bean

  • @ConditionalOnExpression

    当表达式为true的时候,才会实例化一个Bean

  • @ConditionalOnMissingBean

    仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean

  • @ConditionalOnMissingClass

    某个class类路径上不存在的时候,才会实例化一个Bean

  • @ConditionalOnNotWebApplication

    不是web应用

  • @ConditionalOnProperty

    指在配置里配置的属性是否为true,才会实例化一个Bean)

  • @ConditionalOnResource

    若是咱们要加载的 bean 依赖指定资源是否存在于 classpath 中,那么咱们就能够使用这个注解

  • @ConditionalOnJndi

    只有指定的资源经过 JNDI 加载后才加载 bean

  • @ConditionalOnCloudPlatform

    只有运行在指定的云平台上才加载指定的 bean,CloudPlatform 是 org.springframework.boot.cloud 下一个 enum 类型的类,你们能够打开自行看看

到这里,你已经了解了如何灵活配置 bean,但愿你们打开 IDE,自行查看这些注解,了解更多具体内容。(共勉:多看源码,学习大神的代码设计) 

原文地址:Spring条件注解@Conditional,SpringBoot中组合条件你知道吗?

相关文章
相关标签/搜索