SpringBoot - @ConditionalOnProperty注解使用详解

这篇具有很好参考价值的文章主要介绍了SpringBoot - @ConditionalOnProperty注解使用详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

在开发基于SpringBoot框架的项目时,会用到下面的条件注解,有时会有需要控制配置类是否生效或注入到Spring上下文中的场景,可以使用@ConditionalOnProperty注解来控制@Configuration的注解是否生效。

实现原理

@ConditionalOnProperty通过havingValue与配置文件中的值进行对比,如果对比值返回TRUE则配置类生效,反之失效。
Spring Boot 对 @Conditional 注解为我们做了细化,类似的注解共有14个,这些注解都定义在 org.springframework.boot.autoconfigure.condition包下。
SpringBoot - @ConditionalOnProperty注解使用详解

注解说明

A. 这些注解都可以应用在 TYPE 上,也就是说,Spring 自动扫描的一切类 (@Configuration, @Component, @Service, @Repository, @Controller) 都可以通过添加相应的 @ConditionalOnXxxx 来判断是否加载;
B. 这些注解都可以应用在 METHOD 上,所以有 @Bean 标记的方法也可以应用这些注解;
C. 都使用了 @Conditional 注解来标记,OnBeanCondition 等自定义 Condition 也是实现了 Condition 接口。

源码分析

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
    // NAME和VALUE的互为别名,在使用时是互斥的
    String[] value() default {};
    String[] name() default {};

	// 配置项前缀,如果完整配置为:servicex.swagger.config.enabled,则prefix为:servicex.swagger.config
    String prefix() default ""; 

	// 用havingValue与配置项的值进行对比,一致返回TRUE,不一致返回FALSE.
    String havingValue() default "";
	
	// 如果配置文件中, 没有该配置项, 判断是否加载BEAN, 默认为false。
    boolean matchIfMissing() default false;
}

案例分析

配置信息
// 假设YML中的配置如下:
servicex.swagger.config.enabled=true
注解示例①
// 即使配置文件中没有"servicex.swagger.config.enabled"该配置,
// 依然加载SwaggerAutoConfiguration,因为matchIfMissing = true。
@Configuration
@EnableAutoConfiguration
@ConditionalOnProperty(name = "servicex.swagger.config.enabled", matchIfMissing = true)
public class SwaggerAutoConfiguration {
}
注解示例②
// 既指定prefix也指定name,因为配置项为true,所以会加载SwaggerAutoConfiguration。
@Configuration
@EnableAutoConfiguration
@ConditionalOnProperty(prefix = "servicex.swagger.config", name = "enabled")
public class SwaggerAutoConfiguration {
}
注解示例③
// 只指定name或者value,因为配置项为true,所以会加载SwaggerAutoConfiguration。
@Configuration
@EnableAutoConfiguration
@ConditionalOnProperty(name = "servicex.swagger.config.enabled")
public class SwaggerAutoConfiguration {
}
注解示例④
// 只指定name或者value,因为配置项为true,havingValue也为true,所以会加载SwaggerAutoConfiguration。
@Configuration
@EnableAutoConfiguration
@ConditionalOnProperty(name = "servicex.swagger.config.enabled", havingValue = "true")
public class SwaggerAutoConfiguration {
}
注解示例⑤
// 只指定name或者value,因为配置项为true,havingValue为false,所以不会加载SwaggerAutoConfiguration。
@Configuration
@EnableAutoConfiguration
@ConditionalOnProperty(name = "servicex.swagger.config.enabled", havingValue = "false")
public class SwaggerAutoConfiguration {
}
servicex.swagger.config.enabled havingValue 是否会加载 描述
true true 对比值相同则加载
false false 对比值相同则加载
true false × 对比值不相同则不会加载
false true × 对比值不相同则不会加载
true / 加载(如果havingValue不设置,是否加载由配置项决定)
false / × 不加载(如果havingValue不设置,是否加载由配置项决定)

常见注解

ConditionalOnProperty
ConditionalOnResource

// 当某个Bean在应用上下文存在时,才会加载
ConditionalOnBean
@ConditionalOnBean(MyAutoConfiguration.class)
public class SwaggerAutoConfiguration {
}
// 当某个Bean在应用上下文不存在时,才会加载
ConditionalOnMissingBean

// 当某个Bean在CLASS-PATH存在时,才会加载
ConditionalOnClass
// 当某个Bean在CLASS-PATH不存在时,才会加载
ConditionalOnMissingClass

// 当表达式的返回值为TRUE时,才会加载
ConditionalOnExpression
@ConditionalOnExpression("${servicex.swagger.config.enabled:true} and ${swagger.config.enabled:true}")
public class SwaggerAutoConfiguration {
}

// 指定资源在CLASS-PATH存在时,才会加载
ConditionalOnResource
@ConditionalOnResource(resources = "/banner.txt")
public class SwaggerAutoConfiguration {
}

相关博文

在SpringBoot中如何自定义starter
SpringBoot - @ConditionalOnMissingBean注解使用详解
SpringBoot - @ConfigurationProperties注解使用详解文章来源地址https://www.toymoban.com/news/detail-426344.html

到了这里,关于SpringBoot - @ConditionalOnProperty注解使用详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot使用@Valid 和 @Validated 注解校验详解以及编写一个自定义全局异常类

    全局异常处理类 验证: ============================================== 导入所需要的包: 如果你是 springboot 项目,那么可以不用引入了,已经引入了,他就存在于最核心的 web 开发包里面。 如果你不是 springboot 项目,那么引入下面依赖即可: 新建三个实体类 实现一: 使用@Valid注解修

    2024年02月10日
    浏览(41)
  • SpringBoot - @PreAuthorize注解详解

    写在前面 @PreAuthorize注解会在方法执行前进行权限验证,支持Spring EL表达式,它是基于方法注解的权限解决方案。只有当@EnableGlobalMethodSecurity(prePostEnabled=true)的时候,@PreAuthorize才可以使用,@EnableGlobalMethodSecurity注解在SPRING安全中心进行设置,如下: 如何使用 ①. 注解如何使用

    2024年02月12日
    浏览(41)
  • 详解SpringBoot的常用注解

    在SpringBoot中,注解是一种非常重要的编程方式,它可以简化代码,提高开发效率。本文将详细介绍SpringBoot中的常用注解,以及它们的使用方法和场景。 1.1 概述 @SpringBootApplication 是SpringBoot应用程序的核心注解,通常用于主类上。它包含了以下三个注解: @Configuration :表示该

    2024年02月13日
    浏览(87)
  • SpringBoot - @Transactional注解详解

    简介 Spring中的@Transactional注解,基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷的解决在开发中碰到的问题,@Transactional 的事务开启 ,或者是基于接口的或者是基于类的代理被创建。Spring为了更好的支撑数据库操作,在框架中支持了两种事务管理的方式:编

    2024年02月09日
    浏览(37)
  • Spring boot @ConditionalOnProperty 使用以及作用

    来源 即: 来源于Spring boot 中的自动化配置部分 实际作用: 通过读取本地配置文件中的值来判断 某些 Bean 或者 配置类 是否加入spring 中。 即 当前类通过 @Component 或者 @Configuration 注册实体到spring 中时,都可以通过 @ConditionalOnProperty 来控制是否加入或者说有无该项。 与 @Com

    2024年02月09日
    浏览(46)
  • SpringBoot注解详解:从核心到Web,从数据到测试,一网打尽

    总结的了平时学习springboot常用的一些注解,方便以后开发时可以阅览回忆 springboot的常用注解可以分为以下几类: 核心注解 :这些注解是springboot的基础,用于启动、配置和管理springboot应用。 Web MVC注解 :这些注解是基于spring MVC框架的,用于处理Web请求和响应。 数据访问注

    2024年02月11日
    浏览(44)
  • SpringBoot缓存相关注解的使用

    @CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置 @Cacheable:主要方法的返回值将被加入缓存。在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问 @CachePut:主要用于数据新增和修改操作 @CacheEvict:配置于函数上,通常用在删除方法上,用来从缓存中

    2024年01月19日
    浏览(37)
  • 多个springboot整合使用rabbitmq(使用注解的方式)

    先参考单个springboot使用rabbitmq和了解rabbitmq的五种模式 单个springboot整合rabbitmq_java-zh的博客-CSDN博客 1、先创建两个springboot项目, 一个做生产者,一个做消费者  2、导包(生产者和消费者对应的内容都是一样) 3、编写配置文件 这里的配置文件生产者和消费者都一样 这里以rab

    2024年02月11日
    浏览(30)
  • SpringBoot复习(30):@DateTimeFormat注解的使用

    一、实体类 二、控制器类:

    2024年02月13日
    浏览(39)
  • SpringBoot简单使用切面类(@aspect注解)

    简介 Spring Boot中的AOP(Aspect Oriented Programming, 面向切面编程)可以让我们实现一些与业务逻辑无关的功能,如日志、事务、安全等。 特点 把这些跨切面关注点抽取出来,实现解耦。 使用切面承载这些功能的实现,而不污染业务逻辑。 在定义好的切入点Join Point,执行这些功能,比如方

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包