【Spring Boot】元注解

元注解

  • 1.元注解
    • 1.1 @Target
    • 1.2 @Retention
    • 1.3 @Inherited
    • 1.4 @Documented
    • 1.5 @interface
  • 2.自定义注解
    • 2.1 创建自定义注解类
    • 2.2 实现业务逻辑
    • 2.3 使用自定义注解

1.元注解

元注解就是定义注解的注解,是 Java 提供的用于定义注解的基本注解。

注解
说明
@Retention是注解类,实现声明类 Class,声明类别 Category,声明扩展 Extension
@Target放在自定义注解的上边,表明该注解可以使用的范围
@Inherited允许子类继承父类的注解,在子类中可以获取使用父类注解
@Documented表明这个注释是由 Javadoc 记录的
@interface用来自定义注释类型

1.1 @Target

该注解的作用是告诉 Java 将自定义的注解放在什么地方,比如类、方法、构造器、变量上等。它的值是一个枚举类型,有如下属性值。

  • ElementType.CONSTRUCTOR:用于描述构造器。
  • ElementType.FIELD:用于描述成员变量、对象、属性(包括 enum 实例)。
  • ElementType.LOCAL_VARIABLE:用于描述局部变量。
  • ElementType.METHOD:用于描述方法。
  • ElementType.PACKAGE:用于描述包。
  • ElementType.PARAMETER:用于描述参数。
  • ElementType.TYPE:用于描述类、接口(包括注解类型)或 enum 声明。

1.2 @Retention

该注解用于说明自定义注解的生命周期,在注解中有三个生命周期。

  • RetentionPolicy.RUNTIME:始终不会丢弃,运行期也保留该注解,可以使用反射机制读取该注解的信息。自定义的注解通常使用这种方式。
  • RetentionPolicy.CLASS:类加载时丢弃,默认使用这种方式。
  • RetentionPolicy.SOURCE:编译阶段丢弃,自定义注解在编译结束之后就不再有意义,所以它们不会写入字节码。@Override@SuppressWarnings 都属于这类注解。

1.3 @Inherited

该注解是一个标记注解,表明被标注的类型是可以被继承的。如果一个使用了 @Inherited 修饰的 Annotation 类型被用于一个 Class,则这个 Annotation 将被用于该 Class 的子类。

1.4 @Documented

该注解表示是否将注解信息添加在 Java 文档中。

1.5 @interface

该注解用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过 default 来声明参数的默认值。

定义注解格式见以下代码:

public @interface 注解名{定义体}

2.自定义注解

有时需要自定义注解来快捷地实现功能。本实例演示如何自定义注解,以及实现业务逻辑处理。

2.1 创建自定义注解类

package com.example.demo;import org.springframework.stereotype.Component;import java.lang.annotation.*;@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MyTestAnnotation {String value();
}

代码解释如下。

  • 使用 @Target 注解标注作用范围。
  • 使用 @Retention 注解标注生命周期。
  • 使用 @Documented 将注解信息添加在 Java 文档中。

2.2 实现业务逻辑

以 AOP 的方式实现业务逻辑,见以下代码:

package com.example.demo;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;@Aspect
@Component
public class TestAnnotationAspect {// 拦截被 TestAnnotation 注解的方法;如果需要拦截指定 package 指定规则名称的方法,可以使用表达式 execution(...)@Pointcut("@annotation(com.example.demo.MyTestAnnotation)")public void myAnnotationPointCut() {}@Before("myAnnotationPointCut()")public void before(JoinPoint joinPoint) throws Throwable {MethodSignature sign = (MethodSignature) joinPoint.getSignature();Method method = sign.getMethod();MyTestAnnotation annotation = method.getAnnotation(MyTestAnnotation.class);// 获取注解参数System.out.print("打印TestAnnotation 参数:" + annotation.value());}}

类注解

  • @Aspect:这是一个切面注解,用于标记这个类为一个切面类。切面类包含了通知(Advice),定义了要在哪些连接点(JoinPoint)上执行的逻辑。
  • @Component:这是一个组件注解,用于将这个切面类注册为 Spring 容器中的一个组件,以便 Spring 可以自动扫描并实例化它。

切入点表达式

  • @Pointcut("@annotation(com.example.demo.MyTestAnnotation)"):这是一个切入点(Pointcut)定义,用于指定这个切面要拦截的操作。这里的切入点表达式表示拦截所有被 MyTestAnnotation 注解标记的方法。

通知方法

  • public void myAnnotationPointCut() {}:这是一个空方法,被上面的 @Pointcut 标注,用来定义切入点逻辑。

前置通知

  • @Before("myAnnotationPointCut()"):这是一个前置通知,表示在切入点 myAnnotationPointCut 指定的方法(即被 MyTestAnnotation 注解的方法)执行之前运行这个通知方法。
  • public void before(JoinPoint joinPoint) throws Throwable {...}:这是实际执行的前置通知方法。在这个方法中,可以获取到被拦截方法的签名、参数等信息,并且可以执行一些自定义的逻辑。
    • MethodSignature sign = (MethodSignature) joinPoint.getSignature();:获取方法签名。
    • Method method = sign.getMethod();:获取具体的方法对象。
    • MyTestAnnotation annotation = method.getAnnotation(MyTestAnnotation.class);:获取方法上的 MyTestAnnotation 注解。
    • System.out.print("打印TestAnnotation 参数:" + annotation.value());:打印注解的参数值。

这段代码的作用是在 Spring AOP 环境下,拦截所有使用了 MyTestAnnotation 注解的方法,并在这些方法执行之前打印出注解的参数值。这种机制可以用来做很多有趣的事情,比如 日志记录权限检查性能监控 等,极大地增强了代码的灵活性和可维护性。

2.3 使用自定义注解

在需要使用的地方使用自定义注解,直接添加注解名即可,见以下代码:

package com.example.demo;import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;@RestController
@EnableAspectJAutoProxy
public class TestController {@RequestMapping("/")@MyTestAnnotation("测试Annotation")public void testAnnotation() {System.err.println("测试自定义注解");}}

运行上面代码,输出如下结果:

在这里插入图片描述

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

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

相关文章

如何使用 Vite 创建一个项目(Vue 或者 React)

如何使用 vite 创建一个 Vue 或者 React 项目? 打开终端,输入命令 npm create vitelatest外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 修改你需要的项目名 选择你要创建的项目的框架(Vue 还是 React 这是个问题&am…

医学影像基础:常见的医学影像学术语和概念

目录 1. 基本影像术语 2. X射线相关术语 3. CT相关术语 4. MRI相关术语 5. 超声相关术语 6. 核医学相关术语 7. 影像质量和技术术语 8. 临床影像术语 总结 在医学影像学中,有许多术语和概念是常用且重要的。了解这些术语和概念有助于更好地理解影像报告、与…

Linux 读者写者模型

1.背景概念 在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会反而高的多。这样就衍生出了读者写者模型,在这个模型中,有两类线程:读者和写者。读…

Linux补基础之:网络配置

目录 一、检查主机与虚拟机是否能正常通信 二、网络的连接模式 桥接模式 流程 特点 NAT模式 流程 特点 仅主机 流程 特点 三、修改静态IP 四、可能遇到的问题 防火墙 DNS 五、主机名更改 六、登录服务器 实际的大数据管理中,会有由很多服务器构成的…

使用AMD GPU和LangChain构建问答聊天机器人

Question-answering Chatbot with LangChain on an AMD GPU — ROCm Blogs 作者:Phillip Dang 2024年3月11日 LangChain是一个旨在利用语言模型强大功能来构建前沿应用程序的框架。通过将语言模型连接到各种上下文资源并基于给定的上下文提供推理能力,L…

蓝海创意云入选中国夏衍电影学会工业与科技影视专业委员会成员单位

党的二十届三中全会指出,科技自立自强是中国式现代化的有力保障。科技兴则民族兴,科技强则国家强。为深入的贯彻落实这一重要部署,推动工业与科技领域的融合发展充分发挥电影艺术在传播科技创新精神、展现工业发展成就方面的独特作用&#xf…

【制造业&流水线】流水线水泥袋检测系统源码&数据集全套:改进yolo11-HSPAN

改进yolo11-RFCBAMConv等200全套创新点大全:流水线水泥袋检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.24 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片…

景区导航地图怎么实现?基于LBS与3D GIS的智慧景区导航导览系统技术路线

随着经济的发展和人们物质生活水平改善,居民的旅游需求呈现多元化和个性化,自助旅游的人越来越多。许多游客在旅游行程中需要随时随地了解旅游景点有关的各类信息,如旅游景点介绍、推荐路线、地图导航等,合理规划和安排旅游线路。正是为了应对…

【Fargo】18:camera获取及预览

QCameraViewfinder.ui 这种报错是.ui的问题, QCameraViewfinder.ui 删掉,只用ZhbCamera.ui 就好了 Build started at 0:10... 1>------ B

【C++】--------- 内存管理

目录 C语言内存管理方式:malloc、calloc、realloc和free C内存管理方式 new和delete 操作内置类型 操作自定义类型 operator new与operator delete函数 new和delete的实现原理 定位new表达式的了解 ​编辑 内存泄漏 C语言内存管理方式:malloc、…

AI大模型与智算中心:构建未来智能社会的基石

随着人工智能技术的飞速发展,AI大模型(如GPT-4、BERT、LLAMA等)在自然语言处理、图像处理、音频处理等多个领域展现出了巨大的应用潜力。这些模型不仅提高了生产效率,更推动了新兴应用的不断涌现。然而,训练和应用这些…

Java Lock CyclicBarrier 总结

前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & CyclicBarrier & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & CyclicBarrier & 总结》(学习总结…

VLAN聚合

VLAN聚合(VLAN Aggregation)是一种网络技术,用于在一个物理网络内通过多个VLAN(称为Sub-VLAN)隔离广播域,并将这些Sub-VLAN聚合成一个逻辑的VLAN(称为Super-VLAN) Super-VLAN&#…

期权懂|个股期权交易手数有限制吗?

本期让我懂 你就懂的期权懂带大家来了解,个股期权交易手数有限制吗?有兴趣的朋友可以看一下。期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 个股期权交易手数有限制吗? 个股期权交易&#…

shodan5,参数使用,批量查找Mongodb未授权登录,jenkins批量挖掘

查找美国安全局漏洞 nww.nsa.gov(美国安全局官方网站) net参数使用 搜索指定的ip网段 shodan search --limit 10 --fields ip_str,port net:208.88.84.0/24 (老美国家安全局的一个网段)可能直接访问不太行,可以使用host参数,得到域名再去…

大型商场应急响应:SpringBoot技术实现

3系统分析 3.1可行性分析 通过对本大型商场应急预案管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大型商场应急预案管理系统采用SSM框架&#xff0…

线程 在linux系统中

1.Linux线程实现 2.Linux线程的创建和终止 3.Linu线程的互斥和同步 Linux或unix系统多任务,线程处理大并发的客户端请求 进程是资源管理的最小单位,线程是程序执行的最小单位 针对在进程中的每一个操作,都是在后台去启动一个一个线程来执…

ImageSharp报错

错误信息 System.MissingMethodException: Method not found: System.Span1<SixLabors.ImageSharp.PixelFormats.Rgba32> SixLabors.ImageSharp.Memory.Buffer2D1.GetRowSpan(Int32).需要升级项目 原来仅升级了SixLabors.ImageSharp没有升级drawing&#xff0c;都升级到…

网站保护神器,雷池社区版的隐藏文件

SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、XSS、 代码注入、命…

线程的理解及基本操作

目录 一、线程的理解 &#xff08;1&#xff09;什么是线程呢&#xff1f; &#xff08;2&#xff09;线程的优缺点及异常 二、线程的基本操作 &#xff08;1&#xff09;创建一个新的进程 &#xff08;2&#xff09;获取线程id &#xff08;3&#xff09;线程终止 &…