Spring 之类元数据封装—MetadataReader

news2025/1/12 21:53:20

在 Spring 中最喜欢干的事情就是将多个参数封装到一个对象,这里就挑选一个例子讲讲——MetadataReader,这个对象是将一个类封装成了三部分:File 文件本身,类元数据,注解元数据。

MetadataReader 元数据对象

先看下这个类的源代码,如下所示:

public interface MetadataReader {

	/**
	 * Return the resource reference for the class file.
	 */
	Resource getResource();

	/**
	 * Read basic class metadata for the underlying class.
	 */
	ClassMetadata getClassMetadata();

	/**
	 * Read full annotation metadata for the underlying class,
	 * including metadata for annotated methods.
	 */
	AnnotationMetadata getAnnotationMetadata();
}

专门提供了三个 API 来获取 File 文件本身,类元数据,注解元数据。Spring 中提供了他的两个子类实现 SimpleMetadataReaderFactory、CachingMetadataReaderFactory,如果想要使用这些对象,那么就得先拿到该对象,那么怎么拿呢?

要想获取到一个对象,最有可能就是通过一个工厂获取到,所以这里就可以通过工厂方法获取,Spring 提供了 CachingMetadataReaderFactory 来获取 MetadataReader 子类对象,用法如下:


@Component
public class MyMetaData implements ResourceLoaderAware {
	private ResourceLoader resourceLoader;

	@Override
	public void setResourceLoader(ResourceLoader resourceLoader) {
		this.resourceLoader = resourceLoader;
	}

	public void metaData() throws Exception {
		CachingMetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourceLoader);

		MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(MyFactoryBean.class.getName());
		System.out.println("metadataReader = " + metadataReader);
	}
}

需要借助一个类加载器去读取到指定文件数据,这里可以通过 ResourceLoaderAware 接口获取到一个资源加载器 resourceLoader,如果不实现,CachingMetadataReaderFactory 工厂自己内部也有默认的类加载器 DefaultResourceLoader。

其实提到了类加载器了,应该就能够猜出要通过 IO 流去读取文件,然后封装数据,这个步骤就是在 getMetadataReader() 方法中做的,源码如下:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

使用案例

定义一个类,如下所示:


@Component
@Import({MyImportSelector.class, AppleEntity.class})
public class MyFactoryBean {

	public String name = "张老三";

}

这个类所有的信息:文件本身,类信息,注解信息,通过 MetadataReader 获取,如下所示:


@Component
public class MyMetaData implements ResourceLoaderAware {
	private ResourceLoader resourceLoader;

	@Override
	public void setResourceLoader(ResourceLoader resourceLoader) {
		this.resourceLoader = resourceLoader;
	}

	public void metaData() throws Exception {
		CachingMetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory();

		MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(MyFactoryBean.class.getName());
		System.out.println("metadataReader = " + metadataReader);

		/**
		 * 获取类 Xxx.class 本地资源文件
		 */
		Resource resource = metadataReader.getResource();
		File file = resource.getFile();
		System.out.println("length = " + file.length());

		/**
		 * 获取类元数据
		 */
		ClassMetadata classMetadata = metadataReader.getClassMetadata();
		System.out.println("classMetadata.getClassName() = " + classMetadata.getClassName());
		System.out.println("classMetadata.getEnclosingClassName() = " + classMetadata.getEnclosingClassName());
		Class<?> aClass = Class.forName(classMetadata.getClassName());
		Constructor<?> constructor = aClass.getConstructor();
		MyFactoryBean myFactoryBean = (MyFactoryBean)constructor.newInstance();
		System.out.println("myFactoryBean = " + myFactoryBean);

		/**
		 * 获取类上的所有注解元数据
		 */
		AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
		MergedAnnotations annotations = annotationMetadata.getAnnotations();
		MergedAnnotation<Import> importMergedAnnotation = annotations.get(Import.class);
		MergedAnnotation<Component> componentMergedAnnotation = annotations.get(Component.class);
		System.out.println("componentMergedAnnotation = " + componentMergedAnnotation);
		System.out.println("importMergedAnnotation = " + importMergedAnnotation);
		String[] values = importMergedAnnotation.getStringArray("value");
		Arrays.asList(values).forEach(System.out::println);
	}
}

Spring 中很多地方都可通过 MetadataReader 获取到类元数据,从而做更多的操作,这个元数据还是非常好用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

架构设计(四):CDN

架构设计&#xff08;四&#xff09;&#xff1a;CDN 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;架构设计&#xff08;四&#xff09;&#xff1a;CDN CSDN&#xff1a;架构设计&#xff08;四&#xff09;&#xff1a;CDN CDN 全称 Content delivery…

Redis面试准备

1. redis网站 Redis Redis文档中心 -- Redis中国用户组&#xff08;CRUG&#xff09; 数据库排名网站&#xff1a;DB-Engines - Knowledge Base of Relational and NoSQL Database Management Systems 2. 基础知识 磁盘中的寻址速度是毫秒级&#xff0c;内存中寻址速度是纳…

[ vulhub漏洞复现篇 ] struts2远程代码执行漏洞s2-048(CVE-2017-9791)

一、漏洞编号 s2-048 CVE-2017-9791二、影响范围 Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本三、漏洞描述 Apache Struts2 2.3.x 系列启用了struts2-struts1-plugin 插件并且存在 struts2-showcase 目录,其漏洞成因是当ActionMessage接收客户可控的参…

【论文精读】Focal Inverse Distance Transform Maps for Crowd Localization

文章目录摘要主要贡献主要内容一、FIDT二、LMDS三。I-SSIM loss摘要 在本文中&#xff0c;我们关注人群定位任务&#xff0c;这是人群分析的一个重要课题。基于回归的方法大多使用卷积神经网络( CNN )对密度图进行回归&#xff0c;在极度稠密的场景中无法准确定位实例&#xf…

跨境卖家如何以最少量的预算建立品牌知名度?

关键词&#xff1a;跨境卖家、品牌知名度 什么是品牌知名度&#xff1f; 品牌知名度反映了您的目标受众对您的品牌的了解、认可和记忆程度。 为什么品牌知名度至关重要&#xff1f; 当您的目标受众需要您提供的产品或服务时&#xff0c;您希望他们考虑您的品牌。为此&#xf…

windows下nginx隐藏HTTP 请求头文件中的Server信息

简介 本文主要是隐藏HTTP 请求头文件中的Server信息 解决问题主要分下面几步 一、准备编译所需要的环境 二、修改nginx源码改变配置 三、编译nginx源码生成新的nginx.exe 四、替换nginx.exe&#xff0c;重新启动nginx 1. 准备所需环境 环境都需要准备好&#xff0c;因为编译是…

精品spring boot+MySQL线上点餐系统vue

《spring bootMySQL线上点餐系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows 8 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff…

大数据毕业设计人体跌倒检测系统

文章目录前言1 实现方法传统机器视觉算法基于机器学习的跌倒检测SVM简介SVM跌倒检测原理算法流程算法效果实现代码深度学习跌倒检测最终效果网络原理最后前言 背景和意义 在美国&#xff0c;每年在65岁以上老人中&#xff0c;平均每3人中就有1人发生意外跌倒&#xff0c;每年…

[附源码]Node.js计算机毕业设计关于人脸识别的实验教学管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

嵌入式分享合集122

一、分析电容降压电路工作原理 电容降压电路&#xff0c;因其成本低廉、体积小而被广泛地使用&#xff0c;此一优点足以掩盖其它所有缺点&#xff1a;输出电流小&#xff08;一般控制在100mA以内&#xff09;&#xff0c;与市电直通非隔离而存在安全隐患&#xff0c;输出电压波…

饥荒服务器搭建(windows)

文章目录1. 获取服务器票据2. 新建游戏存档3. 饥荒服务器配置1. 获取服务器票据 步骤1&#xff1a;登录Klei官网 步骤2&#xff1a;点击菜单栏游戏——选择饥荒服务器 步骤3&#xff1a;创建服务器获取票据&#xff0c;后面将会用到。 2. 新建游戏存档 步骤1&#xff1a;下载…

Python开发游戏?也太好用了吧

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store 当然可以啦&#xff01; 现在日常能够用到和想到的场景&#xff0c;绝大多数都可以用Python实现。 效果怎么样暂且不提&#xff0c;但是得益于丰富的第三方工具包&#xff0c;的确让Python能够很容易…

二进制包安装公有云版k8s

目录公有云版k8s的架构是怎样的公有云中创建k8s实例的过程如下二进制法创建k8s的一般过程Kubernetes的重要性check nodes每台服务器执行基线配置CA rootetcd HA cluster根据CA根证书创建etcd的专有CA证书将etcd注册成为systemd服务配置各master节点的etcd.confansible配置各个m…

4线SPI驱动OLED常规操作

拿到一块点阵屏幕&#xff0c;首先找卖家拿驱动例程 步骤 目录 1.void LCD_IO_Cfg(void) 2.void wr_cmd(u8 wrcmd) 3.void wr_data(u8 wrdata) 4.void init_lcd(void) 5.void disp_all(void) 6.void Fresh(void) 注&#xff1a;根据商家的时序图可以知道数据在上升沿/下降…

[附源码]Node.js计算机毕业设计高校学科竞赛报名系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

CBCC3 – A CBCC Algorithm with Improved Exploration/Exploitation Balance

0、论文背景 本文是在CBCC1和CBCC2的基础上提出了CBCC3。在本文中&#xff0c;证明了过度探索和过度开发是现有CBCC变体中性能损失的两个主要来源。在此基础上&#xff0c;提出了一种新的基于贡献的算法&#xff0c;可以在探索和开发之间保持更好的平衡。 Omidvar M N, Kazimi…

复现readme中的一个坑...

今天在运行一个项目的时候“Molecule Optimization via Fragment-based Generative Models”&#xff1a;GitHub - ninglab/Modof: The implementation of Modof for Molecule Optimization 然后妈的死活运行不出来&#xff0c;就是说在运行readme的时候都不行&#xff0c;我看…

Win10系统下与VMware中Ubuntu20.04建立共享文件夹

一、在VMware中设置 二、在Ubuntu中设置 1.在终端中输入下面命令&#xff0c;列出步骤一中设置的VMware共享文件夹名称&#xff0c;说明可以挂载 ~$ vmware-hgfsclient 返回 ubuntushare 2.执行下面命令&#xff0c;创建共享文件夹专用的挂载目录 ~$ sudo mkdir -p /mnt/hgfs …

基于ESP32-S3方案的2.1寸旋钮屏ZX2D10来了,同步分享ESP32应用功能技术之「WEB API接口」

启明智显基于ESP32-S3与国产芯高效开发平台8ms设计开发的一款磁编码结构的旋钮屏。结构紧凑、简单&#xff0c;外观精致&#xff1b;支持WIFI、蓝牙&#xff0c;语音交互等功能。 产品说明&#xff1a; 1. 使用乐鑫ESP32-S3 WI-FI SOC芯片&#xff0c;SOC提供WI-FI与BLE连接能力…

Java容器源码重点回顾——CopyOnWriteArrayList

1. CopyOnWriteArrayList概述 之前介绍过ArrayList&#xff0c;但是我们知道ArrayList是线程不安全的。如果多个线程同时写数据&#xff0c;就会抛出ConcurrentModificationException。然后我们又学过Vector&#xff0c;它的实现方式是在方法中都加入synchronized关键字&#…