当前位置: 首页 > article >正文

Spring Boot 进阶-详解SpringBoot中条件注解使用

在这里插入图片描述
  作为使用Spring Boot框架的开发者来讲,如果你连如下的这些注解你都没有听说过,没有用过,那我劝你还是放弃吧?

  在Spring Boot中我们最常见到的注解应该是条件注解了吧!也就是@ConditionalXXX的注解。例如在我们自动配置类上经常会看到@ConditionalOnMissingBean,表示在容器中不存在这样一个Bean注入的时候才会生效。

  在Spring Boot的框架中使用了大量的这样的条件注解来实现根据不同的应用场景加载不同的配置项的逻辑,那么接下来我们就来看看在Spring Boot中都有那些值得我们学习和了解的注解呢?

@Conditional

  @Conditional注解是从Spring 4.0版本之后出现的注解,可以标注在任何的类型或者方法上面,通过这个注解来实现一些条件的判断,当满足了对应的条件之后标注了该注解的类或者方法才会被注入到容器中。

  在Spring 或者是SpringBoot中@Conditional注解被大量的使用,例如在控制某个JavaBean对象是否要被注入到容器中的时候,需要采用不同的条件判断来实现。例如前面提到的@ConditionalOnMissingBean、@ConditionalOnBean等等。

  而@Conditional源码相对来说比较简单,如下所示。

@Target({
   ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
   

	/**
	 * All {@link Condition} classes that must {@linkplain Condition#matches match}
	 * in order for the component to be registered.
	 */
	Class<? extends Condition>[] value();

}

  在注解中有一个属性value,可以是一个也可以是多个,而对于这个注解的判断则是由Condition接口实现来进行判断,代码如下

@FunctionalInterface
public interface Condition {
   

	boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

}

Condition接口

  在@Conditional注解判断中,条件是否城里取决于在value中指定的类对象是否是Condition接口的实现,在Condition接口中有一个matches()的方法,如果这个方法返回值为ture的时候则表示判断的条件城里,否则就表示判断条件不成立,也就不能往容器中进行注入操作。其中matches()方法有两个参数分别表示如下的含义

  • ConditionContext :表示要判断条件成立对应的上下文环境是什么,也就是说判断条件成立的时候需要从上下文环境中获取对应的判断条件。
  • AnnotatedTypeMetadata:表示被标记了@Conditional注解的对象的所有元数据信息。用来判断是否满足注入到容器中的条件。

  这其中AnnotatedTypeMetadata没有什么好说的,就是对象标注的信息,而ConditionContext则是条件判断的


http://www.kler.cn/news/335226.html

相关文章:

  • Ubuntu下docker compose 安装部署ElasticSearch 和 Kibana 8.15.2
  • 【数据结构】python中的栈
  • Sublime快捷键的使用和修改
  • 解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
  • 数据结构——“AVL树”的四种数据旋转的方法
  • Leetcode—76. 最小覆盖子串【困难】
  • 分布式ID生成算法:雪花算法(Snowflake)与UUID详解
  • 数据结构之排序(5)
  • 怎么在Windows系统中使用Chrome的语音搜索功能
  • ElasticSearch备考 -- Async search
  • 人工值守向无人值守转变的智慧油站开源了
  • 51单片机的光照强度检测【proteus仿真+程序+报告+原理图+演示视频】
  • 计算机找不到vcomp140.dll,无法继续执行代码如何解决,有什么好的修复方法
  • 顺丰Android面试题集锦及参考答案
  • 【React】类组件和函数组件
  • 智能制造--EAP设备自动化程序
  • 滚雪球学MySQL[4.4讲]:数据库的性能调优详解
  • C语言中的栈
  • JVM类数据共享(CDS)
  • 大厂面试真题-Synchronized和ReentrantLock怎么选