Spring 中的 MetaData 接口

什么是元数据(MetaData)

先直接贴一个英文解释:

Metadata is simply data about data. It means it is a description and context of the data. It helps to organize, find and understand data。

上面介绍的大概意思是:元数据是关于数据的数据,元数据是数据的描述和上下文,它有助于组织,查找,理解和使用数据。

常用的元数据类型有:

标题和说明;

标签和类别;

谁创造的,何时创造的;

谁最后修改时间,什么时候修改;

谁可以访问或更新。

下面举两个列子:

Spring 中的 MetaData 接口

每次使用当今的相机拍照时,都会收集并保存一堆元数据:

日期和时间

文档名称

相机设置

地理位置等

这些数据就是元数据,使用这些数据可以更好的使用照片,比如使用日期和时间信息可以做照片时光机功能(百度网盘好像就有这个功能),使用地理位置信息可以知道你去过哪里。

再看一个列子。

对于一篇博客

Spring 中的 MetaData 接口

每个博客文章都有标准的元数据字段,这些元数据包括:

标题,

作者,

发布时间

类别,

标签。

使用这些元数据可以进行博客的搜索、文章的分类展示管理等。

更多的列子,请参考我的一篇翻译文章:什么是元数据。

好了,到这边你应该已经知道什么是元数据MetaData并了解元数据的作用和功能了。下面就来看看在Spring中元数据是指代啥。

Spring中的MeatData

Spring 中的 MetaData 接口

从上面的类图中,我们看到Spring中和MetaData相关的顶层接口有两个:ClassMetadata和AnnotatedTypeMetadata

ClassMetadata

ClassMetadata,顾名思义,就是表示 Java 中类的元数据。那么类的元数据有哪些呢,打开ClassMetadata的源代码(代码就不贴了),大致有下面这些:

类名;

是否是注解;

是否是接口;

是否抽象类;

父类;

实现的接口等;

详细信息自己可以翻看下源代码,这边要抓住的重点就是要知道ClassMetadata表示的是一个类的元数据。可以和第一节中我举的两个列子类比下。

从上面的类图中可以看出,ClassMetadata有一个实现类是StandardClassMetadata,这个类是基于反射实现获取类元数据的,这个也是类名中“Standard”的含义。

查看源代码你可以发现这个类唯一的一个构造函数已经被标注@Deprecated了,所以这个类已经不建议直接使用了。

AnnotatedTypeMetadata

这个接口表示的是注解元素(AnnotatedElement)的元数据。那什么是注解元素呢?

我们常见的Class、Method、Constructor、Parameter等等都属于它的子类都属于注解元素。简单理解:只要能在上面标注注解的元素都属于这种元素。

public interface AnnotatedTypeMetadata { // 此元素是否标注有此注解,annotationName:注解全类名 boolean isAnnotated(String annotationName); //取得指定类型注解的所有的属性 - 值(k-v) // annotationName:注解全类名 // classValuesAsString:若是true表示 Class用它的字符串的全类名来表示。这样可以避免Class被提前加载 @Nullable Map<String, Object> getAnnotationAttributes(String annotationName); @Nullable Map<String, Object> getAnnotationAttributes(String annotationName, boolean classValuesAsString); // 支持重复注解 MultiValueMap<String, Object> getAllAnnotationAttributes(String annotationName); @Nullable MultiValueMap<String, Object> getAllAnnotationAttributes(String annotationName, boolean classValuesAsString); }

这个接口的继承树如下:

Spring 中的 MetaData 接口

两个子接口相应的都提供了标准实现以及基于ASM的Visitor模式实现。

ASM 是一个通用的 Java 字节码操作和分析框架。它可以用于修改现有类或直接以二进制形式动态生成类。 ASM 虽然提供与其他 Java 字节码框架如 Javassist,CGLIB类似的功能,但是其设计与实现小而快,且性能足够高。

AnnotationMetadata

这是理解Spring注解编程的必备知识,它是ClassMetadata和AnnotatedTypeMetadata的子接口,具有两者共同能力,并且新增了访问注解的相关方法。可以简单理解为它是对注解的抽象。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssdys.html