SpringBoot之@Conditional衍生条件装配详解

文章目录

  • ☃️前言
  • ☃️简介
  • ☃️示例
    • ❄️❄️@ConditionalOnProperty
    • ❄️❄️@ConditionalOnClass
    • ❄️❄️@ConditionalOnBean
    • ❄️❄️自定义条件
  • ☃️SpringBoot源码中使用
  • ☃️总结


在这里插入图片描述

欢迎来到 请回答1024 的博客

🍓🍓🍓欢迎来到 请回答1024的博客

关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开发者。

博客特色: 在我的博客中,开设了如下专栏(点击可以进入专栏奥~): Java、MySQL、Redis、Spring、SpringBoot、SpringCloud、RabbitMQ、微服务、分布式 等相关技术专栏。期待与您一起,探索编程世界中的发现和创新之旅。

🍎🍎🍎我的主页 : https://reply1024.blog.csdn.net

敬请期待定期更新、见解和教程!让我们一起踏上这段编码冒险之旅!

数学与计算的边界 时间与空间的平衡 0与1的延伸

☃️前言

当涉及SpringBoot应用程序的配置和装配时,@Conditional注解是一个非常有用的工具。它允许开发人员根据特定条件来决定是否应该创建一个bean或者装配一段配置。通过这种方式,可以实现更加灵活和可定制的应用程序配置,根据不同的环境或条件提供不同的实现或功能。

在这里插入图片描述


☃️简介

@Conditional注解简介
@Conditional注解可以与@ConditionalOnProperty@ConditionalOnClass@ConditionalOnBean等条件注解结合使用,根据条件判断是否应用装配或配置。这些条件注解可以根据应用程序的运行时环境、类路径上的存在情况或其他条件来确定应用程序的装配方式。


☃️示例

❄️❄️@ConditionalOnProperty

  1. @ConditionalOnProperty示例
    @ConditionalOnProperty是一种常用的条件注解,它根据指定的属性值来决定是否应用装配。例如,可以根据配置文件中的属性来决定某个bean是否应该创建。
@Configuration
@ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
public class MyFeatureConfiguration {
    // 在myapp.feature.enabled为true时装配该bean
    @Bean
    public MyFeatureBean myFeatureBean() {
        return new MyFeatureBean();
    }
}

❄️❄️@ConditionalOnClass

  1. @ConditionalOnClass示例
    @ConditionalOnClass允许根据类路径上是否存在某个类来决定是否应用装配。这对于确保特定库或框架是否可用非常有用。
@Configuration
@ConditionalOnClass(name = "org.springframework.data.redis.core.RedisTemplate")
public class RedisConfiguration {
    // 当RedisTemplate类位于类路径上时,装配该bean
    @Bean
    public RedisTemplate redisTemplate() {
        return new RedisTemplate();
    }
}

❄️❄️@ConditionalOnBean

  1. @ConditionalOnBean示例
    @ConditionalOnBean用于根据是否存在特定的bean来决定是否应用装配。这可以用于根据其他bean的存在与否来决定配置。
@Configuration
public class MyServiceAutoConfiguration {
    
    @Bean
    @ConditionalOnBean(DataSource.class)
    public MyService myService(DataSource dataSource) {
        return new MyService(dataSource);
    }
}

❄️❄️自定义条件

除了使用现有的条件注解外,还可以通过实现Condition接口来创建自定义条件。例如,根据自定义逻辑来决定是否应用装配:

public class MyCustomCondition implements Condition {
    
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 自定义逻辑判断,返回true表示条件匹配,应用装配
        // 这里可以根据ApplicationContext、Environment等上下文信息来判断
        return true; // 自定义条件始终为true,示例用途
    }
}

然后,在配置类中使用自定义条件:

@Configuration
@Conditional(MyCustomCondition.class)
public class MyConfiguration {
    // 当MyCustomCondition条件满足时,装配该配置类
}

☃️SpringBoot源码中使用

SpringBoot 源码中,@Conditional注解的使用非常广泛,它通常用于根据不同的条件来决定是否加载某些配置或者装配特定的 bean。下面是一个简单的例子,展示了 SpringBoot 源码中如何使用@Conditional注解:

@Configuration
@ConditionalOnWebApplication
public class WebMvcAutoConfiguration {
    
    @Configuration
    @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
    @Import(DelegatingWebMvcConfiguration.class)
    @EnableConfigurationProperties(WebMvcProperties.class)
    public static class EnableWebMvcConfiguration extends WebMvcConfigurationSupport {
        // 在缺少 WebMvcConfigurationSupport bean 时加载该配置
        // 这个配置类用于配置 Spring MVC 的相关特性
    }
    
    @Bean
    @ConditionalOnMissingBean({InternalResourceViewResolver.class, ViewResolver.class})
    public InternalResourceViewResolver defaultViewResolver() {
        // 在缺少 InternalResourceViewResolver 和 ViewResolver bean 时创建该 bean
        // 这个 bean 用于处理 JSP 视图解析
        return new InternalResourceViewResolver();
    }
    
    // 其他配置和 bean 的装配...
}

☃️总结

@Conditional注解提供了一种基于条件的装配机制,可以根据运行时环境、配置属性、类路径等因素来动态决定是否应用某个配置或装配某个bean。结合现有的条件注解或自定义条件,开发人员可以灵活地配置SpringBoot应用程序,使其更具可定制性和适应性。在开发过程中,根据实际需求合理使用@Conditional注解,可以使应用程序的配置更加智能和可控。




在这里插入图片描述



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【圆桌论坛】个人作为嘉宾参与问答环节的总结,Create 2024百度AI开发者大会之AI智能体开发与应用论坛

目录 ⭐前言⭐讨论话题✨本质和价值✨端侧部署✨应用商业模式✨商业模式 ⭐主题总结⭐有趣分享 ⭐前言 首先,非常荣幸和开心作为开发者和创业者代表参加百度Create AI大会分论坛圆桌论坛的问答环节。 在分论坛活动开始前,参加了文心智能体平台&#xff…

JS 删除数组元素( 5种方法 )

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、五种…

vue3中web前端JS动画案例(四)侧边栏横幅效果-右下角广告-淘宝案例

myJsAnimation.js, 这里使用了上次封装的动画方法,并进行了改造 /*** 动画的函数* dom 当前对象* JSON 传入元素对象的属性 {"width": 300, "opacity": 50}* * -------------------- 多物体运动,同时运动 ---传入JSON-------------*…

爬虫零基础学习,第一天,安装环境,requests库常用命令的讲解

Python爬虫 爬虫学习思路 URL内容获取,requests的基本常用语法 import requests # 先向目标网站发送请求 url = "http://www.baidu.com" r

【TensorFlow深度学习】人工智能绪论与深度学习前瞻

人工智能绪论与深度学习前瞻 【引言】人工智能的起源与发展机器学习与深度学习的关系深度学习的兴衰与复兴深度学习的特点与前瞻 【引言】 在信息技术蓬勃发展的今天,人工智能已成为推动科技革新和社会进步的关键驱动力。从最初的计算机辅助人类处理信息&#xff0…

UDP文件传输工具之UDP传输的优点和缺点

在当今快节奏的网络通信时代,UDP以其独特的优势,在众多应用场景中扮演着关键角色。本文将深入探讨UDP的优缺点及其应用场景,并重点介绍镭速软件如何通过技术创新,显著提升UDP传输的效率和可靠性。 UDP传输的优点 UDP的显著优势在…

从奇门WMS-A到金蝶云星空通过接口配置打通数据

从奇门WMS-A到金蝶云星空通过接口配置打通数据 接入系统:奇门WMS-A 用于菜鸟的仓库(使用其他支持奇门的仓库同理),故而希望能和仓库的wms系统打通,这样我们采购收货,采购入库,销售出库&#xff…

HTML随机点名程序

案例要求 1.点击点名按钮&#xff0c;名字界面随机显示&#xff0c;按钮文字由点名变为停止 2.再次点击点名按钮&#xff0c;显示当前被点名学生姓名&#xff0c;按钮文字由停止变为点名 案例源码 <!DOCTYPE html> <html lang"en"> <head> <m…

流量反作弊算法简介

参考&#xff1a;流量反作弊算法实践 1. 背景 阅读记录阿里流量作弊的风控文章。甄别阿里妈妈逾千亿商业流量中作弊 与 低质量的部分&#xff0c;保护广告主和平台的利益是风控团队的核心工作之一。 2. 广告风控流程 广告主投放内容与风控团队、下游业务团队的简易交互流程如…

ArrayList与顺序表(2)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

JavaScript中的map()方法详解

1. map() 的返回值是一个新的数组&#xff0c;新数组中的元素为 “原数组调用函数处理过后的值” 2. 简单使用&#xff1a;遍历整个数组&#xff0c;将大于4的元素乘以2 const array [2, 3, 4, 4, 5, 6]console.log("array",array) const map array.map(x > {…

nfs网络存储配置

准备&#xff1a;yum install rpcbind yum install nfs-server 一台服务器&#xff1a;192.168.220.131 一台客户端&#xff1a;192.168.220.220 服务器&#xff1a; 先启动rpcbind服务&#xff1a;systemctl restart rpcbind 在启动…

B站下行CDN架构的探索与应用

本期作者 背景介绍 B站的下行CDN旧架构如下图所示&#xff0c;可以看到边缘CDN节点与中心调度服务有紧密协作&#xff0c;简单说是先由调度服务进行流量调度(负责均衡的调度到每个网关组件节点&#xff09;&#xff0c;再由回源组件进行集群内的回源收敛&#xff0c;最终到对应…

Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路

背景介绍 Rust 是一种多范式、通用的编程语言&#xff0c;强调性能、类型安全和并发性。它通过一个称为“借用检查器”的机制在编译时追踪所有引用的对象生命周期&#xff0c;以强制实现内存安全&#xff0c;即确保所有引用都指向有效的内存&#xff0c;而不需要垃圾收集器。 …

Qwen1.5微调

引子 由于工作上需要&#xff0c;一直在用Qwen做大模型推理&#xff0c;有个再训练的需求&#xff0c;特此琢磨下Qwen的训练。OK&#xff0c;我们开始吧。 一、安装环境 查看显卡驱动版本 根据官网推荐 OK&#xff0c;docker在手&#xff0c;天下我有。 docker pull qwenll…

白酒:馥郁香型白酒的香气特点与生产工艺

云仓酒庄的豪迈白酒介绍到&#xff0c;馥郁香型白酒以其与众不同的香气特点和杰出的生产工艺赢得了消费者的青睐。馥郁香型白酒以其香气浓郁、口感醇厚、回味悠长而著称。下面云仓酒庄豪迈白酒将深入探讨馥郁香型白酒的香气特点与生产工艺。 云仓酒庄豪迈白酒讲诉&#xff0c;馥…

go语言并发实战——日志收集系统(六) 编写日志收集系统客户端

上节回顾 在上一篇文章中我们介绍了编写客户端的四个步骤&#xff0c;分别是&#xff1a; 读取配置文件&#xff0c;寻找日志路径初始化服务根据日志路径l来收集日志将收集到的日志发送Kafka中 关于上述的内容博主画了一个思维导图(有点丑&#xff0c;大家勉强看看&#xff0…

flutter 设置启屏页 flutter_native_splash 坑记录

flutter_native_splash | Flutter packageCustomize Flutters default white native splash screen with background color and splash image. Supports dark mode, full screen, and more.https://pub.dev/packages/flutter_native_splash 发现一直白屏 原因是 代码中 下面…

关于Developers网站的一些使用分享

Android Developers 官网使用分享 语音切换android studio 版本下载最新版本下载位置历史版本下载位置 android studio 版本和 AGP 对应关系API 和 android studio 版本和 AGP 对应关系android studio 版本android 版本API levelandroid.hardware.camera2 语音切换 Developers…

要养生也要时尚,益百分满足你的所有需求

要养生也要时尚&#xff0c;益百分满足你的所有需求 艾灸是个好东西&#xff0c;尤其是在近几年的时候&#xff0c;艾灸就像一阵浪潮席卷进了人们的日常生活之中&#xff0c;我们可以在街边看到大大小小的艾灸馆&#xff0c;有些评价比较高的艾灸馆门前甚至还排起了长长的队伍…