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

2024-04-22 20:44

本文主要是介绍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@Beanpublic MyFeatureBean myFeatureBean() {return new MyFeatureBean();}
}

❄️❄️@ConditionalOnClass

  1. @ConditionalOnClass示例
    @ConditionalOnClass允许根据类路径上是否存在某个类来决定是否应用装配。这对于确保特定库或框架是否可用非常有用。
@Configuration
@ConditionalOnClass(name = "org.springframework.data.redis.core.RedisTemplate")
public class RedisConfiguration {// 当RedisTemplate类位于类路径上时,装配该bean@Beanpublic 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 {@Overridepublic 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注解,可以使应用程序的配置更加智能和可控。




在这里插入图片描述



这篇关于SpringBoot之@Conditional衍生条件装配详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926811

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

springboot将lib和jar分离的操作方法

《springboot将lib和jar分离的操作方法》本文介绍了如何通过优化pom.xml配置来减小SpringBoot项目的jar包大小,主要通过使用spring-boot-maven-plugin... 遇到一个问题,就是每次maven package或者maven install后target中的ja

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH