springboot~获取原注解的方法findMergedAnnotation使用场景

news/2025/9/23 17:41:13/文章来源:https://www.cnblogs.com/lori/p/19107625

这是一个很好的问题,涉及到Spring注解的元注解处理和属性别名机制。让我详细解释一下Spring JMS是如何获取到你自定义注解中的destination值的。

核心机制:Spring的注解属性别名(Attribute Aliasing)

当你在自定义注解中使用@AliasFor@JmsListener的destination属性赋值时,Spring通过以下步骤处理:

1. 注解处理流程

// 你的自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@JmsListener
public @interface MyCustomJmsListener {@AliasFor(annotation = JmsListener.class, attribute = "destination")String value() default "";// 其他属性...
}

2. Spring JMS的内部处理机制

JmsListenerAnnotationBeanPostProcessor是处理@JmsListener的核心类:

// 简化的处理逻辑
public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {// 扫描bean的方法,查找JmsListener注解for (Method method : bean.getClass().getMethods()) {// 这里会使用Spring的AnnotationUtils找到注解JmsListener jmsListener = AnnotatedElementUtils.findMergedAnnotation(method, JmsListener.class);if (jmsListener != null) {processJmsListener(jmsListener, method, bean);}}return bean;}private void processJmsListener(JmsListener jmsListener, Method method, Object bean) {// 获取destination值String destination = jmsListener.destination();// 创建监听器容器...}
}

3. 关键方法:AnnotatedElementUtils.findMergedAnnotation()

这是Spring处理注解属性的核心方法:

// Spring内部的处理逻辑
public static <A extends Annotation> A findMergedAnnotation(AnnotatedElement element, Class<A> annotationType) {// 1. 查找直接或元注解Annotation[] annotations = element.getAnnotations();for (Annotation ann : annotations) {// 2. 如果是目标注解直接返回if (annotationType.isInstance(ann)) {return (A) ann;}// 3. 递归处理元注解Annotation[] metaAnnotations = ann.annotationType().getAnnotations();for (Annotation metaAnn : metaAnnotations) {if (annotationType.isInstance(metaAnn)) {// 4. 处理属性别名映射return synthesizeAnnotation(ann, metaAnn, element);}}}return null;
}

4. 属性别名解析过程

private static <A extends Annotation> A synthesizeAnnotation(Annotation sourceAnnotation, Annotation metaAnnotation, AnnotatedElement element) {Map<String, Object> attributeMap = new HashMap<>();// 获取元注解的属性Method[] metaMethods = metaAnnotation.annotationType().getDeclaredMethods();for (Method metaMethod : metaMethods) {String attributeName = metaMethod.getName();// 检查源注解是否有对应的别名属性Method sourceMethod = findAliasMethod(sourceAnnotation, attributeName);if (sourceMethod != null) {// 使用源注解的值覆盖元注解的值Object value = invokeMethod(sourceMethod, sourceAnnotation);attributeMap.put(attributeName, value);} else {// 使用元注解的默认值Object value = invokeMethod(metaMethod, metaAnnotation);attributeMap.put(attributeName, value);}}// 创建合成注解return AnnotationUtils.synthesizeAnnotation(attributeMap, metaAnnotation.annotationType(), element);
}

5. 实际示例

假设你的使用方式如下:

@Component
public class MyMessageListener {@MyCustomJmsListener("my-queue")public void handleMessage(String message) {// 处理消息}
}

Spring JMS的处理过程:

  1. 发现注解:扫描到@MyCustomJmsListener注解
  2. 识别元注解:发现@MyCustomJmsListener@JmsListener元注解标记
  3. 属性合并:通过@AliasForvalue="my-queue"映射到destination属性
  4. 创建监听器:使用合成后的@JmsListener(destination = "my-queue")创建JMS监听容器

6. 验证方法

你可以通过以下方式验证这个机制:

@SpringBootTest
class JmsListenerTest {@Autowiredprivate JmsListenerEndpointRegistry endpointRegistry;@Testvoid testCustomAnnotation() {// 检查监听器容器是否创建成功Collection<MessageListenerContainer> containers = endpointRegistry.getListenerContainers();for (MessageListenerContainer container : containers) {if (container instanceof JmsListenerEndpointRegistry) {// 验证destination是否正确设置String destination = ((AbstractJmsListenerContainer) container).getDestination();System.out.println("监听的destination: " + destination);}}}
}

总结

Spring通过AnnotatedElementUtils和注解属性别名机制,能够正确识别你自定义注解中通过@AliasFor映射的属性值。这种设计使得注解组合和自定义变得非常灵活,是Spring框架强大的元编程能力的体现。

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

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

相关文章

自己有个服务器 怎样做网站深圳东莞网站开发

一.问题描述 假如我们有一个数组&#xff0c;数组中的元素有正数和负数&#xff0c;如何在数组中找到一段连续的子数组&#xff0c;使得子数组各个元素之和最大。 二.问题分析 分治法求解&#xff1a; 初始状态&#xff1a; low0&#xff1b;highA.length-1&#xff1b;mid&am…

贵阳网站建设哪家公司好山东做网站公司

目录 一. &#x1f981; 前言二. &#x1f981; 像小说一样趣读 Linux 源码三. &#x1f981; 学习路线 一. &#x1f981; 前言 最近、道然科技给狮子送了两本书&#xff1a;一本是付东来的《labuladong的算法笔记》、一本是闪客著的《Linux源码趣读》&#xff0c;《labulado…

手机网页及网站设计网站设计大概多少钱

添加法国&#xff0c;它位于右下方&#xff0c;因此我们应该看到一点…plot(FR,addTRUE)然后&#xff0c;我们可以检索英国退欧公投数据referendumddply(referendum,.(Region,HASC_code),summarise,Remainsum(Remain),Leavesum(Leave))我们可以发现&#xff0c;脱欧赢得了51.89…

德宏网站制作企业推广方式优选隐迅推

一、前言 本次部署elk所有的服务都部署在k8s集群中&#xff0c;服务包含filebeat、logstash、elasticsearch、kibana&#xff0c;其中elasticsearch使用集群的方式部署&#xff0c;所有服务都是用7.17.10版本 二、部署 部署elasticsearch集群 部署elasticsearch集群需要先优化…

南通做网站建设公司网站建设方案计划书人员规划

文章目录一、拖拽滚动1、封装函数2、示例&#xff1a;二、滚轮缩放1、封装函数2、结合拖拽滚动示例一、拖拽滚动 1、封装函数 /*** description 使用鼠标拖拽div&#xff0c;实现横向、纵向滚动* param el 被拖拽滚动的元素&#xff08;产生滚动条的元素&#xff09;*/functio…

比较好的wordpress主题seo外链优化方法

Qt Design Studio设计出的项目结构有多个层级的目录&#xff0c;我们直接用类似Qt Creator工具的方式加载main.qml文件时会报错提示module "content" is not installed&#xff0c;将content加入importPath后还是报同样的错误。 Qt Design Studio生成的文件包含了.qm…

南宁seo网站建设费用环保网站建设公司哪家好

股票商场是一种杂乱的国际&#xff0c;不同类型的股票对应不同的生意商场。其间&#xff0c;创业板股票是一个备受关注的论题。那么&#xff0c;什么样的股票归于创业板呢&#xff1f;本文将从商场定义、股票分类以及出资关键点三个角度分析这个问题&#xff0c;帮忙读者全面了…

长沙建个网站要多少钱彩票网站建设dadi163

用场景的丰富&#xff0c;企业面临着前所未有的数据存储挑战。大规模数据存储变得日常化&#xff0c;伴随着超大容量和快速变化的I/O需求&#xff0c;传统的存储解决方案已经难以满足企业对弹性、运维效率及总体拥有成本&#xff08;TCO&#xff09;的更高要求。这些挑战促使基…

IvorySQL文档共建计划第一期!提 PR,提 Issue,赢取 Beats 耳机、机械键盘、书籍等多重好礼!

文档是开源项目的重要组成部分。结构清晰、内容详细且准确、易于理解,这样的文档可以让用户更容易理解并上手使用开源项目,在使用的过程中,大部分问题也可以通过阅读理解文档来解决。在开源数据库的世界里,一份完整…

ubuntu22.04 安装xrdp

sudo apt updatesudo apt install xrdp -y /etc/xrdp/startwm.sh 内容如下:#!/bin/sh if test -r /etc/profile; then. /etc/profile fiunset DBUS_SESSION_BUS_ADDRESS # 新增 unset XDG_RUNTIME_DIR # 新增#test -…

如何建立营销型网站现在做网站用什么

前言 Swagger 是一个开源的框架&#xff0c;支持 OpenAPI 规范&#xff0c;可以根据 API 规范自动生成美观的、易于浏览的 API 文档页面&#xff0c;包括请求参数、响应示例等信息&#xff0c;并且&#xff0c;Swagger UI 提供了一个交互式的界面&#xff0c;可以帮助我们快速…

厦门网站建设制作多少钱沂南网站开发

文章目录 1. 符号化2. 属性字段分式标注在ArcGIS及Pro中很容易实现格式化标签的,本文讲解在ArcGIS Pro中实现属性字段分式标注,结果如下图所示: 1. 符号化 右键数据图层→符号系统,打开符号系统对话框,住符号系统选择【唯一值】,字段1选择NAME。 2. 属性字段分式标注 加…

企业网站建设方案案例php网站方案

目录 一、介绍二、APP 爬虫常见反爬三、APP 抓包常用工具四、模拟器五、安装 APP1、下载 APP2、安装 APP 六、fiddler1、工作原理2、安装3、基本介绍 七、环境配置1、fiddler 的配置2、夜神模拟器的配置 八、案例 一、介绍 爬虫分类——数据来源 1、PC 端爬虫&#xff08;网页…

西安注册公司地址可以是住宅吗旺道seo优化软件

本文同步Java知音社区&#xff0c;专注于Java作者&#xff1a;linkt1234http://blog.csdn.net/Linkthaha/article/details/100575278最近&#xff0c;在对公司容器云的日志方案进行设计的时候&#xff0c;发现主流的ELK或者EFK比较重&#xff0c;再加上现阶段对于ES复杂的搜索功…

邱启良 深圳网站建设海外网红营销平台

PCL (Point Cloud Library)可视化点云的工具 PCL (Point Cloud Library) 提供了一系列的工具和类用于点云的可视化。以下是其中的一些主要工具和功能: pcl::visualization::CloudViewer: 如前所述,这是一个简单易用的可视化工具,主要用于基本的点云显示。pcl::visualizatio…

中山建设工程招聘信息网站帮企业建设网站保密合同

一阶低通滤波器的推导过程和双线性变换算法请查看下面文章链接: PLC算法系列之数字低通滤波器(离散化方法:双线性变换)_双线性离散化_RXXW_Dor的博客-CSDN博客PLC信号处理系列之一阶低通(RC)滤波器算法_RXXW_Dor的博客-CSDN博客_rc滤波电路的优缺点1、先看看RC滤波的优缺点…

有没有学做零食的网站国内室内设计公司前十名

文章目录 数字相关操作整除与求余取整无穷大进制转换 华为OD算法/大厂面试高频题算法练习冲刺训练 数字相关操作 整除与求余 一般而言&#xff0c;我们使用整除运算//和求余运算%来计算两个整数相除的商和余数。 div 10 // 4 mod 10 % 4如果想要同时得到商和余数&#xff…

题解:P14058 【MX-X21-T3】[IAMOI R5] 两个人的演唱会

P14058:贪心、双指针。先特判这个环本身极差就不超过 \(m\) 的情况(此时答案为 \(1\))。 原问题在环上,不是很好解决,先考虑解决一个更简单的问题:小 R 有一个长度为 \(n\) 的,由正整数组成的链 \(a_1,\dots,a_…

CSP-J 2025 初赛试题解析(第一部分:阅读程序题(一)(16-21)) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …