Spring Boot中@Conditional注解介绍
作者:Dream_it_possible! 时间:2022-03-03 15:23:37
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时会自动跳过该配置类。
来源:https://blog.csdn.net/qq_33036061/article/details/126536173
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
c#开发cad预览图块步骤详解
![](https://img.aspxhome.com/file/2023/7/67547_0s.jpg)
Mybatis示例讲解注解开发中的单表操作
![](https://img.aspxhome.com/file/2023/2/67992_0s.png)
基于Flutter实现多边形和多角星组件
![](https://img.aspxhome.com/file/2023/7/84747_0s.png)
java中如何截取字符串最后一位
![](https://img.aspxhome.com/file/2023/6/60376_0s.png)
SpringBoot 上传文件判空以及格式检验流程
![](https://img.aspxhome.com/file/2023/5/61405_0s.png)
IDEA 2021.2 激活教程及启动报错问题解决方法
![](https://img.aspxhome.com/file/2023/5/59345_0s.png)
详解Maven私 服Nexus的安装与使用
C#基础之异步调用实例教程
spring Bean创建的完整过程记录
![](https://img.aspxhome.com/file/2023/0/71180_0s.jpg)
详解JAVA 线程-线程的状态有哪些?它是如何工作的?
![](https://img.aspxhome.com/file/2023/1/65181_0s.png)
C++string中的insert()插入函数详解
![](https://img.aspxhome.com/file/2023/6/105166_0s.png)
解析Flink内核原理与实现核心抽象
![](https://img.aspxhome.com/file/2023/8/59868_0s.png)
Java实现指定线程执行顺序的三种方式示例
![](https://img.aspxhome.com/file/2023/6/65626_0s.png)
浅析SpringBoot2.4 静态资源加载问题
![](https://img.aspxhome.com/file/2023/8/64158_0s.png)
Mybatis Plus中的流式查询案例
SpringBoot 如何实时刷新静态文件
![](https://img.aspxhome.com/file/2023/5/58765_0s.png)
Java栈和基础队列的实现详解
![](https://img.aspxhome.com/file/2023/7/61597_0s.gif)
浅谈Java的两种多线程实现方式
![](https://img.aspxhome.com/file/2023/9/67639_0s.jpg)