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. 远程控制virtual box虚拟机系统的三种方式
  2. UI设计培训需要学哪些内容
  3. Java集合---LinkedList源码解析
  4. 配置React的Babel 6和Webpack 2环境
  5. CCF-CSP 201612-2 工资计算(C++满分代码)
  6. 牛顿-拉夫逊法 原理讲解以及python算例实现
  7. 01、python数据分析与机器学习实战——Python数据可视化库-Matplotlib
  8. 从基础货币到资金到债券,固收市场的分层都在这了
  9. frontpage编辑html,怎样用FrontPage软件编辑HTML帖子 | 音画代码学堂 - 中国音画家园 - Po...****...
  10. 惠新宸php教程_惠新宸:首位国人加入PHP语言官方开发组
  11. 【Mac】sublime text3标题栏显示文件完整路径
  12. 使用Sqlmap对dvwa进行sql注入测试(初级阶段)
  13. 幕后产品_使用Bitwarden密码管理器在幕后
  14. Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)问题解决
  15. C语言获取程序运行时间
  16. 页号P与页内偏移地址W的计算
  17. 2015境外人气餐厅榜单!你吃过几家?
  18. html相册制作成视频,教你一招把手机相册里照片制作成视频,非常简单,一学就会...
  19. KL,JS,Wasserstein距离
  20. 手把手完成智慧路灯的开发,完成设备上云【华为云IoT】

热门文章

  1. 计算机科学导论实训总结,计算机科学导论课程实习手册(57页)-原创力文档
  2. OpenFec 基本使用
  3. 科大讯飞离线语音合成简单实例
  4. [Java]还在用360压缩吗?自己写一个吧
  5. 完全用Deepin Linux娱乐、工作、学习(1)
  6. mysql主从数据库
  7. 软件工程--团队作业3
  8. 如何使用租用的云服务器实现神经网络训练过程(超详细教程,新手小白适用)
  9. Vivado仿真网表输出高阻态
  10. 我心目中的计算机英语课,教学反思我心目中的英语常态课