java:spring【AnnotationMetadata】的简单使用例子

# 项目代码资源:

可能还在审核中,请等待。。。
https://download.csdn.net/download/chenhz2284/89435385

# 项目代码

【pom.xml】

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.12.RELEASE</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>

【application.properties】

server.port=8080
spring.application.name=myBeanMain

management.server.port=7001
management.endpoints.web.exposure.include=*

【Annotation1.java】

package com.chz.myBeanMain.annotations;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Annotation1 {

    String name() default "Annotation1-name";
    String p1() default "Annotation1-p1";
}

【Annotation2.java】

package com.chz.myBeanMain.annotations;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Annotation1(name = "at Annotation2: Annotation1-name")
public @interface Annotation2 {

    String name() default "Annotation2-name";

}

【Annotation3.java】

package com.chz.myBeanMain.annotations;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Annotation3 {

    String name() default "Annotation2-name";
}

【BranchCommonImportSelector.java】

package com.chz.myBeanMain.imports.importSelector;

@Slf4j
public class BranchCommonImportSelector implements ImportSelector
{
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata)
    {
        log.info("chz >>> BranchCommonImportSelector.selectImports()");
        MyBeanMainTest2.test(annotationMetadata);
        return new String[]{};
    }
}

【MyBeanMainTest.java】

package com.chz.myBeanMain;

@Annotation1(name = "at MyBeanMainTest: Annotation1-name")
@Annotation2(name = "at MyBeanMainTest: Annotation2-name")
@Import(BranchCommonImportSelector.class)
@SpringBootApplication
public class MyBeanMainTest {

    @Annotation1(name = "at main() method")
    public static void main(String[] args) {
        SpringApplication.run(MyBeanMainTest.class, args);
    }

    @Annotation1(name = "at test1() method")
    public static void test1()
    {
    }

    @Annotation2(name = "at test2() method")
    public static void test2()
    {
    }

    @Annotation3(name = "at test3() method")
    public static void test3()
    {
    }
}

【MyBeanMainTest2.java】

package com.chz.myBeanMain;

public class MyBeanMainTest2 {

    public static void main(String[] args) throws Exception
    {
        // 生成【MyBeanMainTest.class】的【AnnotationMetadata】
        AnnotationMetadata annotationMetadata = AnnotationMetadata.introspect(MyBeanMainTest.class);
        MyBeanMainTest2.test(annotationMetadata);
    }

    public static void test(AnnotationMetadata annotationMetadata)
    {
        StandardAnnotationMetadata standardAnnotationMetadata = (StandardAnnotationMetadata)annotationMetadata;

        // 获取注解【Annotation1】的所有属性值
        System.out.println("################################################################");
        Map<String, Object> annotationAttributes = standardAnnotationMetadata.getAnnotationAttributes(Annotation1.class.getName(), false);
        System.out.println(annotationAttributes);

        // 合并所有的注解
        MergedAnnotations mergedAnnotations = standardAnnotationMetadata.getAnnotations();

        // 获取注解【Annotation1】上的【name】属性值
        System.out.println("################################################################");
        MergedAnnotation<Annotation1> annotation1MergedAnnotation = mergedAnnotations.get(Annotation1.class);
        String name = annotation1MergedAnnotation.getString("name");
        System.out.println(name);

        // 获取主程序类的所有注解名(去重)
        System.out.println("################################################################");
        Set<String> annotationTypes = standardAnnotationMetadata.getAnnotationTypes();
        System.out.println(annotationTypes);

        // 列出【MyBeanMainTest】类的所有注解,包括注解的注解
        System.out.println("################################################################");
        for( MergedAnnotation<Annotation> mergedAnnotation : mergedAnnotations ){
            System.out.println(mergedAnnotation.getType());
        }

        // 获取被【Annotation1】注解的所有方法
        System.out.println("################################################################");
        Set<MethodMetadata> annotatedMethods = standardAnnotationMetadata.getAnnotatedMethods(Annotation1.class.getName());
        for( MethodMetadata methodMetadata : annotatedMethods ){
            System.out.println("-----------------------");
            System.out.println(methodMetadata.getMethodName());
            System.out.println(methodMetadata.getAnnotationAttributes(Annotation1.class.getName()));
        }
    }
}

运行与测试

运行【MyBeanMainTest】,查看日志

代码与对应输出1:

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

代码与对应输出2:

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

代码与对应输出3:

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

代码与对应输出4:

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

代码与对应输出5:

在这里插入图片描述
在这里插入图片描述
这里注意【test2()】方法是通过【@Annotation2】间接引入的【@Annotation1】注解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

R 文件优化插件:Binary XML file in layout Error inflating class

场景一&#xff1a;构造函数缺失 问题 自定义布局&#xff08;FlagmentLayout&#xff09;加载自定义属性失败&#xff0c;导致广告显示异常&#xff0c;甚至是闪退&#xff5e; InflateException 在 Android 中我们遇到的通常发生在自定义 View 创建中&#xff0c;动态加载…

家用RJ45水晶头可以用在工业互联网中?

工业互联网作为智能制造的核心组成部分&#xff0c;已经在工业领域快速发展。在建立连接不同设备和系统的复杂网络中&#xff0c;网络设备和连接器的选择变得至关重要。其中&#xff0c;普遍使用的RJ45水晶头和网线在家庭和小型商业网络中被广泛采用&#xff0c;但是否适用于工…

记录一下PHP使用微信小程序支付

记录一下PHP使用微信小程序支付V3版本经历 官方文档&#xff1a;https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_0.shtml 请详细查看文档中小程序支付接入前准备&#xff08;https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml&#xff…

电脑怎么录制游戏视频?轻松捕捉每一帧精彩

随着游戏产业的蓬勃发展&#xff0c;越来越多的玩家不仅满足于在游戏世界中的探索与冒险&#xff0c;更希望将自己的游戏精彩瞬间记录下来&#xff0c;分享给更多的朋友。可是电脑怎么录制游戏视频呢&#xff1f;本文旨在为广大游戏爱好者提供一份详细的电脑游戏视频录制攻略&a…

GraphQL(9):Spring Boot集成Graphql简单实例

1 安装插件 我这边使用的是IDEA&#xff0c;需要先按照Graphql插件&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;打开插件管理 在IDEA中&#xff0c;打开主菜单&#xff0c;选择 "File" -> "Settings" (或者使用快捷键 Ctrl Alt S …

2024黄河流域比赛的复现

目录 WEB [GKCTF 2021]easynode unser 知识点 WEB 根据此题先复现[GKCTF 2021]easynode这个题&#xff0c;这两个题类似 [GKCTF 2021]easynode 1.打开页面发现是登录页面&#xff0c;找到源文件里面的代码&#xff0c;分析如何进行登录&#xff0c;发现经过safeQuery()函…

外网访问公司内网服务器?

【天联】组网天联可以解决不同地区电脑与电脑、设备与设备、电脑与设备之间的信息远程通信问题。在全国各主要节点部署加速服务器&#xff0c;实现在低带宽、跨运营商的网络环境下高速访问&#xff1b;这为公司内网服务器提供了一个可行的外网访问解决方案。 在现代办公环境中…

Unet心电信号分割方法(Pytorch)

心血管疾病是一种常见病&#xff0c;严重影响人们的健康及日常生活。 近年来随着人们生活习惯的不断变化&#xff0c;心血管疾病对人们影响愈加明显&#xff0c;发病率呈现出逐年攀升的趋势&#xff0c;心血管疾病是中国城乡居民死亡的首要原因。心电图ECG已被广泛用于研究心跳…

PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现

PHP语言在设计时忽略了Windows对字符编码转换的 Best-Fit 特性&#xff0c;导致未授权的攻击者可以通过特定字符串绕过 CVE-2012-1823 补丁&#xff0c;执行任意PHP代码&#xff0c;导致服务器失陷。 1.漏洞级别 高危 2.漏洞搜索 fofa: app"XAMPP"3.影响范围 P…

RTOS笔记--资源管理

资源管理 资源管理&#xff0c;其实就是前面介绍过的通知方式中的队列信号量互斥量等是如何访问临界资源的&#xff0c;如何做到完全互斥。 在之前举过一个例子&#xff1a;当我们使用全局变量来进行互斥操作时&#xff0c;有可能在改写全局变量时被切换使得不再互斥&#xff0…

使用thymeleaf直接渲染字符串

目录 一、依赖 二、示例代码 一、依赖 <--JAVA 8--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId><version>2.7.18</version></dependency><-…

如何确保数据跨域交换安全、合规、可追溯性?

数据跨域交换是指在不同的组织、系统或网络之间进行数据的传输和共享。随着数字经济的发展&#xff0c;数据跨域交换在促进数据流通和创新融合方面发挥着重要作用。然而&#xff0c;这一过程也面临着诸多挑战和风险&#xff0c;例如数据安全、合规性、完整性以及责任不清晰等问…

C#操作MySQL从入门到精通(17)——使用联结

前言: 我们在查询数据的过程中有时候查询的数据不是来自一个表而是来自多个表,本文使用的测试数据如下: 本文使用了两个表student_info、address_info student_info的数据如下: address_info的数据如下: 1、内联结 所谓内联结就是求交集,两个表都有的数据才是有效数…

SSH密钥认证:实现远程服务器免密登录的两种方法|Linux scp命令详解:高效实现文件与目录的远程传输

简介&#xff1a; 服务器之间经常需要有一些跨服务器的操作&#xff0c;此时就需要我们在一台服务器上登录到另外一台服务器&#xff0c;若是人为操作时我们都可以每次输入密码进行远程登录&#xff0c;但要是程序需要跨服务器时&#xff0c;每次输入密码就不现实了&#xff0c…

Java 开发实例:Spring Boot+AOP+注解+Redis防重复提交(防抖)

文章目录 1. 环境准备2. 引入依赖3. 配置Redis4. 创建防重复提交注解5. 实现AOP切面6. 创建示例Controller7. 测试8. 进一步优化8.1 自定义异常处理8.2 提升Redis的健壮性 9. 总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨…

基于单片机的数控稳压开关电源研究

为了解决多种类供电的电压需求&#xff0c;克服供电电路体积大、性价比低的问题&#xff0c;复杂电路系统以单片机控制为核心&#xff0c;尝试构建单片机数控开关稳压电源的硬件平台&#xff0c;并开发软件程序&#xff0c;实现系统多种类供电电压输出的控制。实验证明&#xf…

zabbix老版本3.0.14迁移

由于之前zabbix版本过老&#xff0c;一直未能升级&#xff0c;现在一台老的服务器需要迁移&#xff0c;服务器较老&#xff0c;就不更新&#xff0c;先迁移数据&#xff0c; 下载地址&#xff1a; Zabbix Official Repository http://repo.zabbix.com/zabbix/3.0/rhel/7/x86…

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(一)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…

如何使用Spring Boot框架整合Redis:超详细案例教程

目录 # 为什么选择Spring Boot与Redis整合&#xff1f; 1. 更新 pom.xml 2. 配置application.yml 3. 创建 Redis 配置类 4. Redis 操作类 5. 创建控制器 6. 启动应用程序 7. 测试 # 为什么选择Spring Boot与Redis整合&#xff1f; 将Spring Boot与Redis整合可以充分利…

自制一个Linux live固件镜像ISO可引导系统

使用母盘镜像制作两个虚拟&#xff0c;来制作一个包含基本需求的filesystem.squashfs文件&#xff0c;具体看下面的链接 使用的安装镜像 是Linux Mint 制作好的成品 https://cloud.189.cn/t/U32Mvi7FnyA3 &#xff08;访问码&#xff1a;2nbo&#xff09; 最简单制作LIVE CD…