Spring Boot框架中的@Conditional系列注解

Posted Dream_it_possible!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot框架中的@Conditional系列注解相关的知识,希望对你有一定的参考价值。

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. Spring boot 扩展

        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时会自动跳过该配置类。 

        也可以设定matchIfMissing=true,这种场景例如缓存,我们可以这样配置默认是开启缓存的。

@ConditionalOnProperty(name=cache.effect,marchIfMissing=true)

public class CacheAutoConfiguration



   // ...

        如果在application.properties里配置cache.effect=false, 那么该配置类就会跳过,这样配置就能使缓存不生效。 

以上是关于Spring Boot框架中的@Conditional系列注解的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot @Condition 注解,组合条件你知道吗

(007)Spring Boot之自动装配接口Condition对应注解Conditional及其一些默认实现

Spring Boot中的AutoConfiguation核心注解

Spring Boot整合Swagger报错:“this.condition“ is null

Spring Boot整合Swagger报错:“this.condition“ is null

Spring Boot整合Swagger报错:“this.condition“ is null