springboot中使用@Configuration注解完成一个配置类的配置,被该注解标注的类会在程序启动时自动的加载到IOC容器,但如果我们想通过一些条件来控制被@Configuraion注解标注的配置类的生效与否,可以使用springboot提供的@Conditional注解来对条件进行控制,通过该注解指定哪些条件下才能自动加载配置,如果不满足条件,则不加载。以下是常见的@Conditional注解的类型:

1、@ConditionalOnClass

条件是:类路径下,如果存在指定的类,则该配置类生效。类路径即classpath,也就是src路径和pom引入的依赖External Library路径下

@ConditionalOnClass({EnableWebSecurity.class})@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnClassCondition.class})
public @interface ConditionalOnClass {Class<?>[] value() default {};String[] name() default {};
}

2、@ConditionalOnMissingClass

条件是:类路径下,如果不存在指定的类,则该配置类生效

@ConditionalOnMissingClass("org.springframework.cloud.gateway.config.GatewayAutoConfiguration")@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnClassCondition.class})
public @interface ConditionalOnMissingClass {String[] value() default {};
}

3、@ConditionalOnBean

条件是:如果当前应用IOC容器存在指定的Bean,则该配置类生效。

@ConditionalOnBean(ResourceServerConfiguration.class)@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnBean {Class<?>[] value() default {};String[] type() default {};Class<? extends Annotation>[] annotation() default {};String[] name() default {};SearchStrategy search() default SearchStrategy.ALL;Class<?>[] parameterizedContainer() default {};
}

4、@ConditionalOnMissingBean

条件是:如果当前应用IOC容器不存在指定的Bean,则该配置类生效。

@ConditionalOnMissingBean(name = {"springSecurityFilterChain"}
)@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnMissingBean {Class<?>[] value() default {};String[] type() default {};Class<?>[] ignored() default {};String[] ignoredType() default {};Class<? extends Annotation>[] annotation() default {};String[] name() default {};SearchStrategy search() default SearchStrategy.ALL;Class<?>[] parameterizedContainer() default {};
}

5、@ConditionalOnProperty

条件是:如果当前应用的配置文件中存在指定的属性配置,则该配置类生效。

  @ConditionalOnProperty(prefix = "spring.aop",name = {"proxy-target-class"},havingValue = "true",matchIfMissing = true)      @Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {String[] value() default {};String prefix() default "";        // 匹配属性前缀String[] name() default {};         // 匹配属性配置名字String havingValue() default "";    // 指定的配置属性匹配该值时生效boolean matchIfMissing() default false;    // 如果该属性配置不存在是否生效,false不生效,true生效
}

6、@ConditionalOnWebApplication

条件是:如果当前应用是web应用时,则该配置类生效。

@ConditionalOnWebApplication(type = SERVLET)@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnWebApplicationCondition.class})
public @interface ConditionalOnWebApplication {ConditionalOnWebApplication.Type type() default ConditionalOnWebApplication.Type.ANY;public static enum Type {ANY,        // 任何web环境SERVLET,    // servlet环境REACTIVE;   // reactive环境private Type() {}}
}

7、@ConditionalOnExpression

条件是:如果满足指定表达式时,则该配置类生效。

@ConditionalOnExpression("!'${security.oauth2.client.clientId}'.isEmpty()")@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnExpressionCondition.class})
public @interface ConditionalOnExpression {String value() default "true";
}

springboot中的@Conditional注解相关推荐

  1. 难以想象SpringBoot中的条件注解底层居然是这样实现的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...

  2. 面试:SpringBoot中的条件注解底层是如何实现的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...

  3. SpringBoot 中使用 @Valid 注解 + Exception 全局处理器优雅处理参数验证

    作者:超级小豆丁 http://www.mydlq.club/article/49/ 目录 一.为什么使用 @Valid 来验证参数 二.@Valid 注解的作用 三.@Valid 的相关注解 四.使 ...

  4. springboot中使用@Transactional注解事物不生效的原因

    一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...

  5. SpringBoot 中定时执行注解(@Scheduled、@EnableScheduling)

    项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息.Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor .TaskScheduler 接口. ...

  6. springboot中mybatisplus基于注解的多对多级联查询

    mybatisplus使用注解多对多级联查询 mybatis提供了注解和xml两种方式配置我们的sql语句,我在接触使用的过程中更喜欢注解的方式,在我的上一个项目中,我全部使用mybatis注解去完成 ...

  7. SpringBoot中通过ConfigurationProperties注解的方式读取application.yml中配置的属性值

    场景 在SpringBoot后台项目中,某些固定的属性需要配置在配置文件application.yml中. 比如上传到服务器的文件路径. 然后在其他业务代码中比如上传文件接口中需要或者到配置的这个属性 ...

  8. SpringBoot中使用@Mapper注解需要哪个包

    场景 在Eclipse中新建springBoot项目后,要使用@Mapper注解. 实现 打开pom.xml 添加 <!-- mybatis整合Springboot --><depe ...

  9. 关于springboot中的事务注解

    前: 在项目运行时,由于某条数据插入失败,发现事务未起作用 看了下启动类并没有加@EnableTransactionManagement注解开启事务 @EnableScheduling @Spring ...

最新文章

  1. SpringMVC 类扫描原理解析
  2. 在c语言中函数的定义变量的值为,变量定义(C语言中变量的声明和定义)
  3. Linux 内核编码风格【转】
  4. HTTPS 协议到底比 HTTP 协议多些什么?
  5. git常用命令+git规范(附merge合并及冲突解决)
  6. c++ 标准异常类层次结构_Java入门教程十一(异常处理)
  7. “头疼”的俄罗斯开发者:不要再买我的软件了,收入不能提现
  8. 技术分享连载(八十六)
  9. C#入门详解(10)
  10. 介绍两款实用软件:CCPROXY和SOCKSCAP
  11. 如何利用ipad随时随地开发代码
  12. 爬虫---高性能爬虫
  13. 01 创建一个二维地图
  14. html字两边的横线_css实现中间文字 两边横线(原创)
  15. h5 vr效果_H5案例|通过VR展示的那些烧脑游戏
  16. 数学之美:e^x 是如何得到的
  17. 20多年前微软曾计划收购,任天堂嘲讽道:“笑死我了”
  18. 跃居超导和离子阱的量子计算黑马,可编程可扩展的光量子硬件
  19. 不同股票的账面市值比(2012-2020年)
  20. 丢失的相机照片怎么找回来的使用方法分享

热门文章

  1. 2012年中国城市GDP初步排行
  2. 智能IC卡称重系统流程及技术要求
  3. iOS之应用图标AppIcon和启动页LaunchImage
  4. 关于Wear OS应用开发–Tiles我所了解的一些内容(附Demo)
  5. 注册围框html,薄膜太阳能电池板围框的制作方法
  6. pta 乙1035 插入和归并 此题插入好写 归并必须自己模拟--
  7. NVIDIA初创加速计划:12家获奖企业展示AI的无限可能
  8. 搭建个人网站步骤「详细步骤」
  9. C++ primer 第五版习题答案, Stanley B. Lippman( 斯坦利 李普曼)(持续更新中)
  10. 【树形dp】P3155 [CQOI2009]叶子的染色