




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第SpringBoot注解@ConditionalOnClass底层源码实现@ConditionalOnClass的底层源码实现
在SpringBoot中,支持了很多种条件注解,@ConditionalOnClass注解就是其中之一,而且及其重要,它主要是用来判断该注解所指定的某个类或某些类,是否在ClassPath中存在,如果存在则符合条件,如果不存在则不符合。
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnClassCondition.class)
public@interfaceConditionalOnClass{
Class[]value()default{};
String[]name()default{};
这是该注解的源码,可以通过value和name来指定要判断的类,而真正执行判断的逻辑在OnClassCondition类中。
OnClassCondition类继承了FilteringSpringBootCondition类
FilteringSpringBootCondition类又继承了SpringBootCondition类
SpringBootCondition类实现了Condition接口
Spring在解析条件注解时,就会调用Condition接口的matches()方法,在上面的类继承关系中,SpringBootCondition类实现了matches()方法,所以会先被调用。
ConditionOutcome对象
在matches()方法中,会调用getMatchOutcome()方法,并得到ConditionOutcome对象,ConditionOutcome对象就表示条件判断的结果。
publicclassConditionOutcome{
//表示条件是否匹配
privatefinalbooleanmatch;
//...
getMatchOutcome()方法在SpringBootCondition类中是一个抽象方法,在子类OnClassCondition类中才真正实现了getMatchOutcome()方法,并真正会进行条件判断。
所以核心就是这个getMatchOutcome()方法,在这个方法中会先获取@ConditionalOnClass注解的value和name属性的值,这些值就是待判断的类名集合。
//调用getCandidates方法
ListStringonClasses=getCandidates(metadata,ConditionalOnClass.class);
privateListStringgetCandidates(AnnotatedTypeMetadatametadata,ClassannotationType){
MultiValueMapString,Objectattributes=
metadata.getAllAnnotationAttributes(annotationType.getName(),true);
if(attributes==null){
returnnull;
ListStringcandidates=newArrayList();
addAll(candidates,attributes.get(value));
addAll(candidates,attributes.get(name));
returncandidates;
ClassNameFilter.MISSING判断某类是否不存在
接下来就会逐个判断类名集合中的每个类名,判断逻辑为:利用ClassNameFilter.MISSING来判断某类是否不存在?
ListStringmissing=filter(onClasses,ClassNameFilter.MISSING,classLoader);
protectedfinalListStringfilter(CollectionStringclassNames,ClassNameFilterclassNameFilter,ClassLoaderclassLoader){
if(CollectionUtils.isEmpty(classNames)){
returnCollections.emptyList();
ListStringmatches=newArrayList(classNames.size());
for(Stringcandidate:classNames){
if(classNameFilter.matches(candidate,classLoader)){
matches.add(candidate);
returnmatches;
ClassNameFilter.MISSING就是利用ClassLoader来加载类,如果加载到了表示类存在,没加载到就表示不存在。
protectedenumClassNameFilter{
//...
MISSING{
@Override
publicbooleanmatches(StringclassName,ClassLoaderclassLoader){
//是否不存在
return!isPresent(className,classLoader);
staticbooleanisPresent(StringclassName,ClassLoaderclassLoader){
if(classLoader==null){
classLoader=ClassUtils.getDefaultClassLoader();
try{
resolve(className,classLoader);
returntrue;
catch(Throwableex){
returnfalse;
protectedstaticClassresolve(StringclassName,ClassLoaderclassLoader)throwsClassNotFoundException{
if(classLoader!=null){
returnClass.forName(className,false,classLoader);
returnClass.forName(className);
判断完之后,只要missing集合不为空,那就表示待判断的类中有类不存在,那就返回条件不匹配的ConditionOutcome对象,否则就返回条件匹
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纺织生产效率提升的实践试题及答案
- 我的家乡风采活动
- 四川省成都市简阳市阳安中学2022-2023学年高二下学期3月月考物理试题 含解析
- 面料生产中质量监控的有效措施研究试题及答案
- 合同协议书怎么上传
- 商品合同协议书
- 工程合作协议书合同范本
- 母婴合同协议书
- 大型车辆买卖合同协议书
- 保管合同协议书
- 财务与审计的关联与差异试题及答案
- 2024年汉中市中医医院招聘笔试真题
- 租房养宠协议合同
- 密室逃脱劳务合同协议
- 超低排放改造管理制度
- 个人车位出租协议
- 2024-2025年人教版七下语文期中复习-专题03 古诗文阅读(考点串讲)
- 近视的防控课件
- 智能调度算法设计-全面剖析
- 湖北省武汉市九校2024-2025学年下学期3月联考九年级英语试题(含答案无听力原文及音频)
- 山水画九级考题及答案
评论
0/150
提交评论