Spring Boot中@Conditional注解介绍

 更新时间:2022年09月14日 10:24:42   作者:Dream_it_possible!  
@Conditional表示仅当所有指定条件都匹配时,组件才有资格注册。该@Conditional注释可以在以下任一方式使用:作为任何@Bean方法的方法级注释、作为任何类的直接或间接注释的类型级别注释@Component,包括@Configuration类、作为元注释,目的是组成自定义构造型注释

1. @Conditional 注解

@Conditional注解是Spring-context模块提供了一个注解,该注解的作用是可以根据一定的条件来使@Configuration注解标记的配置类是否生效,代码如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.context.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
    Class<? extends Condition>[] value();
}

value值为实现Condition 接口的一个Class,Spring框架根据实现Conditon接口的matches方法返回true或者false来做以下操作,如果matches方法返回true,那么该配置类会被Spring扫描到容器里, 如果为false,那么Spring框架会自动跳过该配置类不进行扫描装配,使用方法:

实现Condition接口, 例如在配置文件里配置了dataSource.none=true, 那么表示不需要使用数据源,那么Spring在扫描的时候会自动跳过该配置类。

package com.bing.sh.datasource;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
 * 如果为返回false,那么Spring会忽略配置类
 */
public class DataSourceCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        // 此处使用 conditionContext获取Environment即可。
        String configureDataSource = conditionContext.getEnvironment().getProperty("dataSource.none", "false");
        return "false".equals(configureDataSource);
    }
}

定义配置类,与@Conditional注解一起使用:

@Configuration
@Conditional(value = DataSourceCondition.class)
public class CustomDataSourceConfig {
}

除了Conditional注解,Spring boot 框架提供了其他conditional系列注解。

2. Springboot扩展

SpringBoot的spring-boot-autoconfigure模块也提供了Conditional系列的相关注解,这些注解能帮助开发者根据一定的条件去装载需要的Bean。

1) @ConditionalOnClass和@ConditionalOnMissingClass注解

当Spring加载的Bean被@ConditionOnClass注解标记时,类加载器会先去先找到指定的Class, 如果没有找到目标Class,那么被ConditionOnClass注解标记的类不会被Spring装载,相反ConditionalOnMissingBean是指如果没有找到目标Class, 那么就装载该类。

2) @ConditionalOnBean 和@ConditionalOnMissingBean注解

当Spring加载的Bean被@ConditionalOnBean注解标记时,接下来会先找到指定的Bean,如果没有找到目标Bean,那么被@ConditionalOnBean标记的类不会被Spring装载,相反ConditionalOnMissingBean是指如果没有Class, 那么就装载该Bean。

3) @ConditionalOnProperty注解

该注解的作用是解析application.yml/application.properties 里的配置生成条件来生效,也是与@Configuration注解一起使用。

属性功能其他
prefix读取配置里的前缀值为prefix的属性, 如果没有返回false 
name读取属性配置里的Key值,如果配置了prefix,那么需要先拼接prefix然后匹配havingValue值 
havingValue匹配属性里的值 
matchIfMissing当未找到对应的配置时是否匹配,默认为false, 如果为true,没有找到配置,那么也匹配。 

使用场景,例如在指定数据源时,指定datasource的type。例如包含如下配置使用Hikari数据源。

spring.datasource.type=com.zaxxer.hikari.HikariDataSource

在使用时,一般设置matchIfMissing=false, 这样条件没有匹配上的话会Spring在扫描bean时会自动跳过该配置类。

到此这篇关于Spring Boot中@Conditional注解介绍的文章就介绍到这了,更多相关SpringBoot @Conditional 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot打jar包之后下载文件的路径问题

    springboot打jar包之后下载文件的路径问题

    这篇文章主要介绍了springboot打jar包之后下载文件的路径问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java中怎样处理空指针异常

    Java中怎样处理空指针异常

    程序中的变量是 null,就意味着它没有引用指向或者说没有指针。这时,我们对这个变量进行任何操作,都必然会引发空指针异常,本文主要介绍了Java中怎样处理空指针异常,感兴趣的可以了解一下
    2022-05-05
  • 详解application.properties和application.yml文件的区别

    详解application.properties和application.yml文件的区别

    这篇文章主要介绍了详解application.properties和application.yml文件的区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Java实现注册邮箱激活账户实例代码

    Java实现注册邮箱激活账户实例代码

    本篇文章主要介绍了Java实现邮箱激活账户实例代码,这里整理了详细的代码,具有一定的参考价值,有需要的小伙伴可以参考下。
    2017-07-07
  • SpringBoot使用Spring Security实现登录注销功能

    SpringBoot使用Spring Security实现登录注销功能

    这篇文章主要介绍了SpringBoot使用Spring Security实现登录注销功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09
  • cmd使用javac和java及注意事项

    cmd使用javac和java及注意事项

    这篇文章主要介绍了cmd使用javac和java及注意事项,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-12-12
  • java 基础知识之网络通信(TCP通信、UDP通信、多播以及NIO)总结

    java 基础知识之网络通信(TCP通信、UDP通信、多播以及NIO)总结

    这篇文章主要介绍了java 基础知识之网络通信总结的相关资料,包括TCP通信、UDP通信、多播以及NIO,需要的朋友可以参考下
    2017-03-03
  • 一文搞懂 MyBatis的事务管理机制

    一文搞懂 MyBatis的事务管理机制

    MyBatis是一款优秀的持久层框架,相信很多Java后端开发人员对它都不会陌生。本文将从事务概述、MyBatis实现事务的方式、事务实现源码分析方面详细解析MyBatis的事务管理机制,需要的朋友可以参考下
    2023-05-05
  • Springboot自带定时任务实现动态配置Cron参数方式

    Springboot自带定时任务实现动态配置Cron参数方式

    这篇文章主要介绍了Springboot自带定时任务实现动态配置Cron参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java数组的三种扩容方式以及程序实现详解

    java数组的三种扩容方式以及程序实现详解

    这篇文章主要介绍了java数组的三种扩容方式以及程序实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论