【spring】@Conditional注解学习

news2024/9/25 17:11:09

@Conditional介绍

@Conditional注解用于按照设定的条件进行判断,从而决定是否将某个bean注册到Spring容器中。

@Conditional注解是在Spring 4.0版本中引入的,它提供了一种更加灵活的方式来控制bean的创建和注册。在此之前,开发者通常使用@Profile注解来根据不同的环境配置来加载不同的bean,但@Profile的使用范围相对有限,仅适用于基于环境变量的条件检查。而@Conditional注解则更加通用,允许开发者自定义条件检查策略,从而实现更复杂的条件逻辑。

这个注解可以用于类级别,也可以用于方法级别。

要使用@Conditional注解,你需要创建一个实现了Condition接口的类,并重写matches方法来定义你的条件判断逻辑。当matches方法返回true时,对应的bean将会被注册到Spring容器中;如果返回false,则不会注册。这种机制使得你可以根据应用的配置、环境变量或其他任何条件来决定是否创建某个bean实例。

@Conditional 注解可以与以下条件类一起使用

  • OnClassCondition:检查类路径中是否存在指定的类。

  • OnMissingClassCondition:检查类路径中是否不存在指定的类。

  • OnBeanCondition:检查Spring容器中是否存在指定的Bean。

  • OnMissingBeanCondition:检查Spring容器中是否不存在指定的Bean。

  • OnPropertyCondition:检查系统属性或环境变量是否满足指定的条件。

  • OnResourceCondition:检查类路径中是否存在指定的资源。

  • OnWebApplicationCondition:检查是否是Web应用程序环境。

@Conditional源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
	Class<? extends Condition>[] value();
}
源代码截图

@Conditional 属性介绍

  • value:指定Condition接口的实现类,Condition接口的实现类中需要编写具体代码实现向Spring中注入Bean的条件

@Conditional 注解使用场景

@Conditional注解的使用场景主要体现在以下几个方面:

  • 基于属性配置的条件注入:使用@ConditionalOnProperty可以根据指定的属性是否存在或是否具有特定的值来决定是否创建和注册Bean。这在需要根据配置文件动态决定是否启用某个功能时非常有用。
  • 基于Bean存在的条件注入@ConditionalOnBean注解可以用来检查Spring上下文中是否已经存在某个Bean,如果存在,则创建和注册新的Bean。这在需要某个Bean作为依赖时尤其有用。
  • 基于类存在的条件注入@ConditionalOnClass注解用于检查某个类是否在类路径中可用,如果可用,则进行Bean的创建和注册。这在自动配置和模块加载时非常有用。
  • 基于资源存在的条件注入@ConditionalOnResource注解允许你根据特定资源的存在与否来决定是否创建和注册Bean。这在需要外部资源(如文件、URL等)时很有帮助。
  • 基于Web环境的条件注入@ConditionalOnWebApplication注解用于确保只有在Web环境中才会创建和注册Bean,这对于Web特定功能的自动配置非常有用。
  • 基于SpEL表达式的条件注入@ConditionalOnExpression注解允许你使用Spring Expression Language (SpEL) 来定义复杂的条件表达式,从而控制Bean的创建和注册。
  • 自定义条件实现:你可以自定义实现Condition接口的类,通过实现matches方法来定义自己的条件逻辑。这种方式提供了最大的灵活性,允许你根据任何复杂的条件来决定Bean的创建

@Conditional测试示例代码

示例代码 一
ConditionalDemo类
package com.yang.SpringTest.annotation.conditionalLearn;

import lombok.Data;

/**
 * <p>description</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.conditionalLearn
 * Ceate Time 2024-03-20 14:55
 */
@Data
public class ConditionalDemo {
}
ConditionalDemoCondition类
package com.yang.SpringTest.annotation.conditionalLearn;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * <p>description</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.conditionalLearn
 * Ceate Time 2024-03-20 14:52
 */

public class ConditionalDemoCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String osName = context.getEnvironment().getProperty("sun.desktop");
        return osName.contains("windows") ? true : false;
    }
}
ConditionalDemoConfig配置类
package com.yang.SpringTest.annotation.conditionalLearn;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

/**
 * <p>配置类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.conditionalLearn
 * Ceate Time 2024-03-20 14:54
 */
@Slf4j
@Configuration
@Conditional(ConditionalDemoCondition.class)
public class ConditionalDemoConfig {
    @Bean
    public ConditionalDemo demo() {
        log.info("------------- ConditionalDemo init -------------");
        return new ConditionalDemo();
    }
}
ConditionalTest测试类
package com.yang.SpringTest.annotation.conditionalLearn;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;

/**
 * <p>测试类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.conditionalLearn
 * Ceate Time 2024-03-20 14:58
 */

public class ConditionalTest{
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionalDemoConfig.class);
            String[] definitionNames = context.getBeanDefinitionNames();
            Arrays.stream(definitionNames).forEach((definitionName) -> System.out.println(definitionName));
        }
}
运行结果




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1533779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络原理】HTTP 请求 (Request)详解

文章目录 &#x1f38d;请求格式&#x1f384;认识URL&#x1f338;query string&#x1f338;关于 URL encode &#x1f340;认识 “方法” (method)&#x1f338;GET方法&#x1f338;POST 方法&#x1f338;GET 和 POST 的区别 &#x1f332;认识请求 “报头” (header)&…

cocos控制物体移动轨迹

引擎&#xff1a;CocosCreator 3.8.2 思考了很久决定要不要发这票文章。因为毕竟我也是一个新手。但是这个问题真的困扰了我很久。 特意分享给大家。 如图所示有2个方块。他们可以跟着轨迹移动。 这个轨迹箱子总体来说有以下几个规则。 1.只能沿着轨迹移动。 2.上面只能有一…

[ C++ ] STL---string类的模拟实现

目录 string类的成员变量 构造函数 有参构造函数 无参构造函数 析构函数 拷贝构造函数 赋值运算符重载 string类对象的容量操作 string类对象的遍历与访问 [ ] 下标遍历 迭代器遍历 string类对象的增删查改 string类的成员变量 string类底层为动态开辟的字符数组&a…

提升水库大坝安全与效率:现代技术云平台的应用

在我国&#xff0c;水库大坝的数量居世界之首&#xff0c;它们在推动国民经济发展中扮演着不可或缺的角色。然而&#xff0c;要想让这些水利工程充分发挥其价值&#xff0c;不仅需要精准的调度与高效的管理&#xff0c;更重要的是要确保其安全无虞。一旦发生事故&#xff0c;后…

【机器学习】基于变色龙算法优化的BP神经网络分类预测(SSA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】变色龙优化算法&#xff08;CSA)原理及实现 2.设计与实现 数据集&#xff1a; 数据集样本总数2000 多输入多输出&#xff1a;样本特征24&#xff…

Java中的I/O讲解(超容易理解)(上篇)

如果想观看更多Java内容 可上我的个人主页关注我&#xff0c;地址子逸爱编程-CSDN博客https://blog.csdn.net/a15766649633?spm1000.2115.3001.5343使用工具 IntelliJ IDEA Community Edition 2023.1.4 使用语言 Java8 代码能力快速提升小方法&#xff0c;看完代码自己敲一…

智慧乡村赋能发展:数字乡村推动农村经济社会持续繁荣

目录 一、智慧乡村的内涵与发展意义 二、智慧乡村赋能发展的路径 1、加强信息基础设施建设 2、推进农业生产智能化 3、提升乡村治理现代化水平 4、推动农村产业融合发展 三、智慧乡村发展面临的挑战与对策 四、智慧乡村发展的未来展望 1、技术融合创新将更加深入 2、…

百度智能云+SpringBoot=AI对话【人工智能】

百度智能云SpringBootAI对话【人工智能】 前言版权推荐百度智能云SpringBootAI对话【人工智能】效果演示登录AI对话 项目结构后端开发pom和propertiessql_table和entitydao和mapperservice和implconfig和utilLoginController和ChatController 前端开发css和jslogin.html和chat.…

怎么在Linux系统下Docker部署Excalidraw白板工具并实现无公网IP远程访问?

文章目录 1. 安装Docker2. 使用Docker拉取Excalidraw镜像3. 创建并启动Excalidraw容器4. 本地连接测试5. 公网远程访问本地Excalidraw5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 本文主要介绍如何在Ubuntu系统使用Docker部署开源白板工具Excal…

【Linux】实现进度条小程序

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 回车和换行3. 缓冲区4. 进度条4.1 倒计时设置4.2 进度条4.2.1 实现简单进度条4.2.2 进度条完善 5. 附进度条代码5.1 Processbar.h5.2 Processbar.c5.3 Main.c5.4 Makefile 1. 前言 在之前已经了解了 【Lin…

C++ list详解及模拟实现

目录 本节目标 1. list的介绍及使用 1.2 list的使用 2.list的模拟实现 1.对list进行初步的实现 2.头插和任意位置的插入 3.pos节点的删除&#xff0c;头删&#xff0c;尾删 4.销毁list和析构函数 5.const迭代器 6.拷贝构造和赋值操作 3.完整代码 本节目标 1. list的…

怎么做扫码签到活动_一场别开生面的活动签到革新之旅

在数字化飞速发展的今天&#xff0c;传统的签到方式已无法满足人们对高效、便捷、互动性的追求。为此&#xff0c;我们创新性地推出了扫码签到活动&#xff0c;为您带来一场前所未有的智慧互动新体验。 工具/原料 微信小程序 飞多多网站 方法/步骤 一、扫码签到&#xff0c…

【目标跟踪】奇葩需求如何处理(二)

文章目录 一、前言二、奇葩需求2.1、井盖2.2、管线 三、后记 一、前言 在工作中往往出现些奇葩需求。上一篇介绍了一些奇葩需求奇葩需求如何处理&#xff08;一&#xff09; &#xff0c;今天给大家分享一些更奇葩的需求。 二、奇葩需求 2.1、井盖 昨天突然接到一个需求&…

JAVA_会话

会话技术 1.会话: 一次会话包含多次请求和响应 2.功能: 在一次会话的范围内的多次请求&#xff0c;共享数据 3.方式: 3.1.客户端会话技术 Cookie(甜点) 1.概念: 客户端会话技术,将数据保存到客户端 2.快速入门: 1.创建Cookie对象,绑定数据new Cookie(String name,String v…

msvcp140.dll是什么文件?msvcp140.dll丢失如何解决(最新教程)

在玩电脑的时候&#xff0c;经常会碰到一些烦人的东西&#xff0c;比如那个“msvcp140.dll丢失”啥啥啥的。这个东西一出现&#xff0c;整个人都不好了&#xff0c;完全影响了我们愉快电脑生活的节奏。为啥会出现msvcp140.dll丢失的这种情况&#xff0c;怎么解决&#xff0c;还…

精读《架构设计之 DCI》

本期精读文章是&#xff1a;The DCI Architecture 1 引言 随着前端 ES6 ES7 的一路前行&#xff0c; 我们大前端借鉴和引进了各种其他编程语言中的概念、特性、模式; 我们可以使用函数式 Functional 编程设计&#xff0c;可以使用面向对象 OOP 的设计&#xff0c;可以使用面向…

【C++从练气到飞升】04---拷贝构造函数

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、拷贝构造函数的引入 1. 以日期类为例:进行的值拷贝是不会发生错误的 2. 以栈类为例:进行的值拷贝会发现发…

C语言基础(十六)通过指针来输入和获取结构体的变量值

老样子&#xff0c;先看代码 #include <stdio.h> #include <string.h>#define NLEN 30 struct namect{char fname[NLEN];char lname[NLEN];int letters; };void getinfo(struct namect *); void makeinfo(struct namect *ptr); void showinfo(const struct namec…

Kubernetes的Namespace使用

在 Kubernetes 中&#xff0c;命名空间提供了一种用于隔离单个集群中的资源组的机制。资源名称在命名空间内必须是唯一的&#xff0c;但不能跨命名空间。基于命名空间的作用域仅适用于命名空间物体 &#xff08;例如部署、服务等&#xff09;而不是集群范围的对象&#xff08;例…

牛客周赛 Round 37VP(DEF)

D.思维题&#xff1a; 若按照顺序发现很难入手&#xff0c;于是我们不妨先小紫&#xff0c;再让小红反悔即可 假设为cabababbabazbc&#xff0c;如果直接小紫&#xff0c;那么它一定以a开头&#xff0c;于是小红可以先把首尾的a去掉&#xff0c;即czbc,此时可以得到bc,于是小红…