SpringBoot条件注解ConditionalOnClass底层原理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot条件注解ConditionalOnClass底层原理相关的知识,希望对你有一定的参考价值。
参考技术A 最近使用了ConditionalOnClass注解,但是不知道底层是怎么实现的,趁周末看一下,顺便进行记录。先来看一下结构:核心是OnClassCondition这个类,最上层实现了Condition接口。最后判断是否存在这个类,是使用的ClassLoader.loadClass()方法。
然后看@ConditionalOnClass注解源码
它有2个属性,分别是类数组和字符串数组(作用一样,类型不一样),而且被@Conditional注解所修饰,这个@Conditional注解有个名为values的 Class< ? extends Condition >[] 类型的属性。 这个Condition是个接口,用于匹配组件是否有资格被容器注册,定义如下:
也就是说@Conditional注解属性中可以持有多个Condition接口的实现类,所有的Condition接口需要全部匹配成功后这个@Conditional修饰的组件才有资格被注册。
Condition接口有个实现抽象类SpringBootCondition,SpringBoot中所有条件注解对应的条件类都继承这个抽象类。它实现了matches方法:
然后提供了一个抽象方法getMatchOutcome等待子类去实现。
SpringBoot提供了两个基于Class的条件注解:@ConditionalOnClass(类加载器中存在指明的类)或者@ConditionalOnMissingClass(类加载器中不存在指明的类)。
@ConditionalOnClass或者@ConditionalOnMissingClass注解对应的条件类是OnClassCondition,定义如下:
先看实现的getMatchOutcome方法
最后看一下是如何匹配的,在 List<String> missing = filter(onClasses, ClassNameFilter.MISSING, classLoader); 方法
以上是关于SpringBoot条件注解ConditionalOnClass底层原理的主要内容,如果未能解决你的问题,请参考以下文章