手写Spring源码02 - 元数据读取器 MetadataReader 设计与实现(一)

功能介绍

读取类的信息,如类名、修饰符、内部类、外部类、父类、接口名称、成员方法、注解、注解的元注解等

代码演示

注解@Zhy上打了注解@Zhy2,ZhyConcret类上打了@Zhy注解:

@Zhy
public class ZhyConcret {
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Zhy2
public @interface Zhy {
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Zhy2 {
}

读取ZhyConcret.class:

//获取到类资源,使用上篇记录的ResourcePatternResolver获取到类资源
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resourcePatternResolver.getResources("org/springframework/core/type/classreading/ZhyConcret.class");
//对类资源进行读取
SimpleMetadataReader simpleMetadataReader = new SimpleMetadataReader(resources[0], ClassLoader.getSystemClassLoader());

读取结果:

在这里插入图片描述

展开annotations属性,里面记录注解以及注解的元注解信息

在这里插入图片描述

整体设计

元数据的定义和实现

AnnotatedTypeMetadata: 可被注解标注的元数据都继承自这个接口,这里定义了通用方法如获取所有注解,判断是否被某个注解标注等等,MethodMetadata和AnnotationMetadata都继承自AnnotatedTypeMetadata,说明这些元数据是可以被注解标注的

ClassMetadata: 类的元数据定义,用来记录类的信息,实现类有SimpleAnnotationMetadata

AnnotationMetadata: 注解的元数据定义,用来记录注解信息。因为注解本质是一个继承了Annotation的接口,所以继承了ClassMetadata。实现类有SimpleAnnotationMetadata

MethodMetadata: 方法的元数据定义,用来记录方法的信息,实现类有SimpleMethodMetadata

类的读取和访问实现(访问者设计模式)

ClassReader: 读取类信息,传递给访问者

ClassVisitor: 类的访问者,ClassReader读取到类信息会传递给访问者,访问者将数据封装成SimpleAnnotationMetadata元数据。实现类有SimpleAnnotationMetadataReadingVisitor

AnnotationVisitor: 注解访问者,将数据封装成TypeMappedAnnotation,ClassVisitor中依赖AnnotationVisitor,当访问结束时回调ClassVisitor的方法将数据传递给ClassVisitor。实现类有MergedAnnotationReadingVisitor

MethodVisitor: 方法访问者,将数据封装成SimpleMethodMetadata元数据,ClassVisitor中依赖MethodVisitor,当访问结束时回调ClassVisitor的方法将数据传递给ClassVisitor。实现类有SimpleMethodMetadataReadingVisitor

合并注解定义和实现

MergedAnnotation: 合并的注解定义,实现类TypeMappedAnnotation内部使用AnnotationTypeMapping保存注解的映射关系

MergedAnnotations: 是MergedAnnotation的集合类,实现类MergedAnnotationsCollection使用了AnnotationTypeMappings扫描注解的元注解信息并存储到MergedAnnotation[ ] 类型的成员变量中

注解类型映射的实现

AnnotationTypeMapping: 注解类型映射类,这里保存了注解上上下级关系,处理了注解的别名,内部有一个Map<Methed, List> 的aliasedBy保存了别名的映射关系,key是value集合元素的别名

AnnotationTypeMappings: 注解类型映射类的集合,扫描获取了注解的元注解,每个元注解封装成AnnotationTypeMapping,并做了缓存。内部使用AnnotationsScanner扫描元注解,AnnotationsScanner中使用AnnotationFilter对注解进行过滤

AnnotationFilter: 注解过滤器定义,定义了校验的方法。实现类PackageAnnotationFilter包注解过滤器,作用是根据注解的包名进行匹配

AnnotationsScanner: 扫描注解器,作用是扫描注解上的注解,使用PackageAnnotationFilter对注解进行过滤

MetadataReader定义与实现

MetadataReader: 元数据读取,本篇主要介绍的,内部注解或间接使用了上面介绍的类。实现类只有SimpleMetadataReader

类之间的关系如下图:

在这里插入图片描述

SimpleAnnotationMetadataReadingVisitor定义了注解、方法等访问方法,ClassReader接收类文件的输入流和SimpleAnnotationMetadataReadingVisitor做为参数,开始读取类,并回调访问者中的方法,将信息传递给访问者,访问者保存信息,访问结束的时候封装成对用的元数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值