苍穹外卖Day3碰到的元注解

1. @Target

@Target注解用于指定自定义注解可以应用的Java元素范围。它的参数是ElementType的枚举值,可以指定一个或多个范围。使用@Target可以限制注解只能用于特定的程序元素,如类、方法、字段等。

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;@Target(ElementType.METHOD) // 只能用于方法
public @interface CustomAnnotation {// 注解的成员
}

ElementType的常用值包括:

  • TYPE: 类、接口(包括注解类型)或枚举声明
  • FIELD: 字段声明(包括枚举常量)
  • METHOD: 方法声明
  • PARAMETER: 参数声明
  • CONSTRUCTOR: 构造方法声明
  • LOCAL_VARIABLE: 局部变量声明
  • ANNOTATION_TYPE: 注解类型声明
  • PACKAGE: 包声明

2.@Retention

@Retention注解指定自定义注解的保留策略,即注解的信息保留到哪个阶段。它的参数是RetentionPolicy的枚举值,决定了注解在源代码(Source)、字节码(Class)或运行时(Runtime)被保留。

例如下面的代码定义了一个注解@CustomAnnotation,它在运行时依然可用:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME) // 在运行时保留
public @interface CustomAnnotation {// 注解的成员
}

RetentionPolicy的常用值包括:

  • SOURCE: 注解只在源代码中保留,编译器编译时会被忽略。
  • CLASS: 注解在编译到字节码文件中,但在运行时不会被虚拟机保留。这是默认的保留策略。
  • RUNTIME: 注解在运行时保留,可以通过反射获取到。

@Target@Retention一起使用,可以精确控制自定义注解的使用场景和生命周期,使得注解的设计更加灵活和强大。

比如说苍穹外卖Day3中自定义注解AutoFill时,为了这个注解能够加在方法(ElementType.METHOD)上,来标识某个方法需要进行功能字段自动填充处理,就是通过下面这段代码实现的:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {//数据库操作类型:UPDATE INSERTOperationType value();
}

其中

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)

可以简单记忆成固定搭配

3. @Aspect

@Aspect是一个用于定义切面的注解。在面向切面编程(AOP)中,切面是一个可以包含多个通知(Advice)和切点(Pointcut)的模块。通知是在特定的程序执行点插入的代码片段,而切点定义了那些执行点。@Aspect注解告诉Spring框架,该类包含AOP切面的定义。

4.@Component

@Component是一个通用的立体注解,它用来标识一个Spring管理的组件。当Spring框架的扫描器检测到这个注解时,它会在Spring应用上下文中创建一个该类的实例。这是实现依赖注入的一种方式。@Component可以被视为告诉Spring,“这是一个组件,我希望你管理它”。

5.@slf4j

@slf4j是一个来自Lombok库的注解,用于自动注入一个SLF4J(Simple Logging Facade for Java)类型的日志对象。它在编译时会自动生成一个日志对象,这样你就可以在你的类中使用日志对象来记录日志,而不需要手动创建它。通常,这能让日志记录变得更加简洁。6.6.

import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;@Aspect
@Component
@Slf4j
public class MyService {public void performAction() {log.info("Performing an action in MyService");// ... method implementation}
}

6. @PointCut 

切面类定义过程中需要两个注解,一个是@PointCut,一个是通知,我们先来说接入点。

@Pointcut注解用于定义一个切点(Pointcut),即一组满足特定条件的连接点(Join Point),其中连接点代表了程序执行的某个特定位置,例如方法的执行或异常的处理。切点表达式决定了在哪些连接点上应用通知(Advice)。这样,你可以重用切点表达式,并将其与不同的通知关联起来。

   @Aspectpublic class MyAspect {@Pointcut("execution(* com.example.service.*.*(..))")public void serviceMethods() {// 切点表达式}}

@Pointcut("execution(* com.example.service.*.*(..))")表示serviceMethods()方法标记有@Pointcut注解,其表达式表示应用于com.example.service包下所有类的所有方法。

苍穹外卖Day3里用到了

@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")

这个注解的含义是:

匹配com.sky.mapper包下所有类(*代表所有类)的所有方法(第二个*代表所有方法),但仅应用于那些被指定注解com.sky.annotation.AutoFill标记的方法。

7.@Before

@Before注解用于定义一个前置通知(Before Advice),它将在匹配的方法执行之前执行。你可以指定一个切点表达式或引用一个已经定义的切点来决定这个前置通知应用的位置。前置通知用于在方法实际执行之前执行某些操作,例如安全检查、初始化资源、日志记录等。

   @Aspectpublic class MyAspect {@Before("serviceMethods()")public void beforeServiceMethods(JoinPoint joinPoint) {// 前置通知的逻辑System.out.println("Before executing method: " + joinPoint.getSignature().getName());}}

在这个例子中,beforeServiceMethods()方法标记有@Before注解,并引用了serviceMethods()定义的切点。这意味着在com.example.service包中的任何方法执行之前,都会先执行beforeServiceMethods()中的代码。 

8. @annotation

 在@Pointcut注解中使用@annotation可以让你根据方法上的注解来过滤方法,你可以根据自定义的注解来选择哪些方法将触发通知的执行。

// 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Audit {// 注解中可以定义属性,例如记录操作类型等
}// 切面类
@Aspect
public class AuditAspect {// 切点表达式,匹配所有被@Audit注解标记的方法@Pointcut("@annotation(Audit)")public void auditMethods() {}// 通知方法,将在匹配的方法执行前执行@Before("auditMethods()")public void beforeAudit(JoinPoint joinPoint) {// 通知中的逻辑,例如记录日志System.out.println("Audit action before method: " + joinPoint.getSignature().getName());}
}

该切点只匹配那些被@Audit注解标记的方法。

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

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

相关文章

文兴业:从内蒙古小镇到全球金融巨擘的不凡旅程

文兴业的传奇人生,如同一部跨越时间和地域的史诗,描绘了一个内蒙古小镇男孩如何凭借自己的智慧、勤奋和不屈不挠的精神,在全球商界创造了辉煌成就的故事。这个故事不仅仅是关于个人的成功,更是关于如何通过教育和持续的自我提升&a…

开发调试、远程访问、内网穿透解决方案集合

开发调试、远程访问、内网穿透解决方案集合 前言Cpolar下载安装配置与使用 Ngrok购买隧道下客户端配置与使用 ZeroTier注册与安装创建虚拟网络加入虚拟网络配置授权 花生壳Centos系统Ubuntu系统使用花生壳控制台SN码登录添加映射 Loophole通过CLI方式安装登录与注销简单使用身份…

网络安全是什么? 为什么要学网络安全 ?网络安全怎么学习?

网络安全是什么? 网络安全是指保护计算机网络、网络设备、应用程序、数据和用户免受非法访问、攻击、破坏或泄漏的过程和技术。网络安全包括多个领域,例如网络防御、漏洞管理、加密技术、身份验证和访问控制等等。 网络安全非常重要,因为现…

【好玩的经典游戏】Docker环境下部署RPG网页小游戏

【好玩的经典游戏】Docker环境下部署RPG网页小游戏 一、react-tetris小游戏介绍1.1 react-tetris小游戏简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 安装Docker环境3.2 检查Docker服务状态3.3 检查Docker版本3.4 检查docker compose…

省一餐,是减瘦捷径?还是牺牲健康的换取?

肥胖从来不是靠短时间的,每天少吃一餐就能减掉的,需要长期坚持。但三餐不管哪一餐,长期不吃,都不会有好结果。为了瘦,失去健康值不值呢? 长期不吃早饭后果 1、消耗率、吸收率减慢:身体经过一整…

解锁新功能,Dynadot现支持BITPAY平台虚拟货币

Dynadot现已支持虚拟货币付款!借助与BitPay平台的合作,Dynadot为您提供了多种安全的虚拟货币选择。我们深知每位客户都有自己偏好的支付方式,因此我们努力扩大了支付方式范围。如果您对这一新的支付方式感兴趣,在结账时您可以尝试…

扩散模型零样本分类应用笔记

1 Title Your Diffusion Model is Secretly a Zero-Shot Classifier(Alexander C. Li, Mihir Prabhudesai, Shivam Duggal, Ellis Brown, Deepak Pathak)【ICCV 2023】 2 Conclusion This paper shows that the density estimates from large-scale tex…

阿里云4核8G服务器多少钱一年?

阿里云4核8G服务器优惠价格955元一年,配置为ECS通用算力型u1实例(ecs.u1-c1m2.xlarge)4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选,CPU采用Intel(R) Xeon(R) Platinum处理器,阿里云活动链接 aliyunfuwuq…

SSH介绍及检测规则思路分析

一、SSH 1、定义 SSH是安全的加密协议,用于远程连接linux服务器。 2、ssh服务的主要功能: 1)提供远程链接服务器的功能; 2)对远程链接传输的数据进行加密 3、ssh与telnet的区别: 服务链接方式 服务数据…

DBO优化LSBoost回归预测(matlab代码)

DBO-LSBoost回归预测matlab代码 蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种新型的群智能优化算法,在2022年底提出,主要是受蜣螂的的滚球、跳舞、觅食、偷窃和繁殖行为的启发。 数据为Excel股票预测数据。 数据集划分为训练集、验证集、测试集,比…

【国家计算机二级C语言】高分笔记

二叉树 参考 http://t.csdnimg.cn/ozVwT 数据库 SQL程序语言有四种类型,对数据库的基本操作都属于这四类,它们分别为;数据定义语言(DDL)、数据查询语言(DQL)、数据操纵语言(DML)、数据控制语言…

领夹麦配LDR6028,电力持久畅聊畅!

#无线麦克风#麦克风,对于大多数人来说,并不陌生。然而,领夹式麦克风,这个看似小巧的音频设备,或许在日常生活中并不常为我们所见。但在自媒体行业、新闻记者等领域,它却是不可或缺的好帮手。这款领夹式麦克…

树状数组优化dp,2617. 网格图中最少访问的格子数

目录 一、题目 1、题目描述 2、接口描述 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 给你一个下标从 0 开始的 m x n 整数矩阵 grid 。你一开始的位置在 左上角 格子 (0, 0) 。 当你在格子 (i, j) 的时候,你可以移动…

架构之安全性维度

流程安全性 安全基本原则:可用性 完整性 机密性 CIA 安全框架:zachman P2DR Sabsa IPDRR IATF 安全评估方法:安全测试: SAST静态测试、 IAST交互测试 安全扫描 危险模型:攻击树分析 DREAD风险评估 渗透测试&#xff1a…

管理类联考–复试–英文面试–问题--规划介绍原因做法--纯英文版

借鉴 https://www.bilibili.com/video/BV1Dk4y187zN/?p4&spm_id_from333.880.my_history.page.clickhttps://www.bilibili.com/video/BV1Dk4y187zN/?p4&spm_id_from333.880.my_history.page.click https://ttsreader.com/zh/https://ttsreader.com/zh/ 规划 视频版…

2024年NOC大赛创客智慧(西瓜创客)图形化编程真题模拟试卷包含答案

详细题目看顶部资源 答案解析 一、选择题 1、C 该段代码是将变量的值翻倍,运行之后变量的值是之前的两倍。变量的值是否改变取决于初始值是否为 0,所以船都不正确 2、C A 透项为让角色说话,不可以广播消息: B 选项为播放一段声音,不可以广播消息; C透项为广播消息,正确: …

OCP NVME SSD规范解读-14.Firmware固件升级要求

4.11节 Firmware Update Requirements 描述了数据中心NVMe SSD固件更新的具体要求,确保固件升级过程既安全又可靠,同时充分考虑了设备在升级过程中的可用性和功能性。 FWUP-1: 设备必须记录每一次固件激活过程。这意味着固件升级过程中,设备会…

使用远程工具连接Mysql

(若想要远程连接Mysql需要下面解决四个问题) 1、目标地址 直接查询 2、端口号 3306 3、防火墙关闭 [rootlocalhost date]# systemctl stop firewalld.service 4、授权mysql数据库root用户权限(因为mysql开始不允许其他IP访问&#xff0…

时间减少90%以上!分布式系统的性能优化实战

1背景 分布式批量系统指的是采用分布式数据库架构,主体功能由批量程序实现的系统。分布式系统批量程序的性能测试,除了和联机交易性能测试一样关注服务器资源使用率是否合理、是否存在性能异常外,在测试执行阶段需要关注是否因数据分布不均衡…

JsonUtility.ToJson 和UnityWebRequest 踩过的坑记录

项目场景: 需求:我在做网络接口链接,使用的unity自带的 UnityWebRequest ,数据传输使用的json,json和自定义数据转化使用的也是unity自带的JsonUtility。使用过程中发现两个bug。 1.安全验证失败。 报错为&#xff1a…