【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("测试自定义注解");}}
运行上面代码,输出如下结果:

相关文章:
【Spring Boot】元注解
元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解 元注解就是定义注解的注解,是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解…...
基于信号分解和多种深度学习结合的上证指数预测模型
大家好,我是带我去滑雪! 为了给投资者提供更准确的投资建议、帮助政府和监管部门更好地制定相关政策,维护市场稳定,本文对股民情绪和上证指数之间的关系进行更深入的研究,并结合信号分解、优化算法和深度学习对上证指数…...
基于Spring Boot的酒店住宿管理平台
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理酒店客房管理系统的相关信息成为必然。开发…...
游聚对战平台 三国战纪2012CE修改器修改地址
游聚对战平台 三国战纪2012比较全的一次地址。 工具 ce修改器 自行百度下载 1袖箭 2褐色鸡蛋 3毒堂 4飞盘 5火焰弹 6绿色鸡蛋 7金珠 8毒蝎 9毒镖 10铁莲花 11张陵剑 12张角巾 13太清丹经 14黄石公 15九节杖 16隐身衣 17神仙笔 18 玉蜂术(效果不明)19天师…...
Qt Creator中的项目栏
shadow build: [基础]Qt Creator 的 Shadow build(影子构建)-CSDN博客 影子构建:将源码路径和构建路径分开(生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁。 实验1: 我创建了两个项目:…...
keepalived+web 实现双机热备
环境:利用keeplived实现web服务器的双机热备(高可用) 注意: (1) 利用keeplivedweb做双击热备(高可用),最少需要两台服务器,可以实现多域名对应一个VIP,并且访问不同域名,显示不同主页…...
关于python的import
在Python中,import语句用于导入其他模块或模块中的特定部分,以便在代码中使用它们。这就可以重用代码,而不是每次都从头开始编写所有的功能。 基本用法 导入整个模块: import module_name 例如: import math print(…...
帕金森后期吞咽困难:破解难题,重拾生活美味!
在这个快节奏的时代,健康成为了我们最宝贵的财富。然而,对于帕金森病患者及其家庭而言,随着病情的进展,尤其是进入后期阶段,吞咽困难成为了他们不得不面对的严峻挑战。今天,就让我们一起走进这个温暖而坚韧…...
android 添加USB网卡并配置DNS
工作需要,需要使用TBox分享的网络,Android将TBox当作一个USB网卡,接下来就简单了,配置这个网卡的信息即可。 加载默认网卡的信息在frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java中 Ethern…...
【面试经典150】day 8
#1024程序员节 | 征文# 作为一个未来的程序员,现在我要继续刷题了。 力扣时刻。 目录 1.接雨水 2.罗马数字转整数 3.最后一个单词的长度 4.最长公共前缀 5.反转字符串中的单词 1.接雨水 好好好好好好,一开始就接雨水。我记得接了n次了。。。 痛苦战…...
Python -- 网络爬虫
Python – 网络爬虫 流程: 1. 连接链接获取页面内容(html文件); 2. 过滤获取需要信息(正则) [可能重复步骤1,2] ; 3. 存储文件到本地。一)网络连接获取页面内容 # 网络…...
【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-5
文件下载与邀请翻译者 学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么ÿ…...
设计模式4 适配器 (adapter)
一句话,适配器按照客户的需求, 适配当前已有的接口。 目标接口:reqeust() public interface Target {void request(); //this is client needed interface }已有接口:specificRequest package com.example.adapter;import android.uti…...
《分布式机器学习模式》:解锁分布式ML的实战宝典
在大数据和人工智能时代,机器学习已经成为推动技术进步的重要引擎。然而,随着数据量的爆炸性增长和模型复杂度的提升,单机环境下的机器学习已经难以满足实际需求。因此,将机器学习应用迁移到分布式系统上,成为了一个不…...
【项目实战】HuggingFace初步实战,使用HF做一些小型任务
Huggingface初步实战 一、前期准备工作二、学习pipline2.1.试运行代码,使用HuggingFace下载模型2.2. 例子1,情感检测分析(只有积极和消极两个状态)2.3. 例子2,文本生成 三、学会使用Tokenizer & Model3.1.tokenizer(分词器&am…...
堆的应用——堆排序和TOP-K问题
1.堆排序 想法⼀: 基于已有数组建堆、取堆顶元素完成排序。也就是利用写好的堆数据结构(之前的文章有讲解),去实现排序。 void HeapSort(int* a, int n){HP hp;for(int i 0; i < n; i){HPPush(&hp,a[i]);}int i 0;whi…...
探秘 MySQL 数据类型的艺术:性能与存储的精妙平衡
文章目录 前言🎀一、数据类型分类🎀二、整数类型(举例 TINYINT 和 INT )🎫2.1 TINYINT 和 INT 类型的定义2.1.1 TINYINT2.1.2 INT 🎫2.2 表的操作示例2.2.1 创建包含 TINYINT 和 INT 类型的表2.2.2 插入数据…...
使用任意绘图软件自学并结合上课所学内容完成数据库原理图绘制
本次绘图采用亿图图示软件...
static、 静态导入、成员变量的初始化、单例模式、final 常量(Content)、嵌套类、局部类、抽象类、接口、Lambda、方法引用
static static 常用来修饰类的成员:成员变量、方法、嵌套类 成员变量 被static修饰:类变量、成员变量、静态字段 在程序中只占用一段固定的内存(存储在方法区),所有对象共享可以通过实例、类访问 (一般用类名访问和修…...
基于SSM的智能养生平台管理系统源码带本地搭建教程
技术栈与架构 技术框架:采用SSM(Spring Spring MVC MyBatis)作为后端开发框架,结合前端技术栈layui、JSP、Bootstrap与jQuery,以及数据库MySQL 5.7,共同构建项目。 运行环境:项目在JDK 8环境…...
Slurm集群升级记:为什么以及如何将PMIx从v3.x迁移到v4.x?
Slurm集群升级实战:PMIx v3.x到v4.x迁移的深度解析 引言:为什么HPC管理员需要关注PMIx升级? 在Slurm集群的日常运维中,组件升级往往被视为"必要之恶"——既期待新特性带来的性能提升,又担忧升级过程中的兼容…...
零代码制作专业播客:SoulX-Podcast让AI语音合成触手可及
零代码制作专业播客:SoulX-Podcast让AI语音合成触手可及 【免费下载链接】SoulX-Podcast SoulX-Podcast is an inference codebase by the Soul AI team for generating high-fidelity podcasts from text. 项目地址: https://gitcode.com/gh_mirrors/so/SoulX-Po…...
京东AI优势持续升级,京东的AI大棋局怎么看?
日前,京东媒体沟通会召开,会上,京东展示了其在大模型、数字人、AI硬件及企业级解决方案上的最新布局。这次畅谈让我们看到了更多的京东大棋局,京东的AI战略并非单纯的技术军备竞赛,而是一场围绕“降本增效”与“生态重…...
5大优势:邱锡鹏《神经网络与深度学习》如何帮新手系统掌握AI核心技术
5大优势:邱锡鹏《神经网络与深度学习》如何帮新手系统掌握AI核心技术 【免费下载链接】nndl.github.io 《神经网络与深度学习》 邱锡鹏著 Neural Network and Deep Learning 项目地址: https://gitcode.com/GitHub_Trending/nn/nndl.github.io 神经网络与深…...
STM32标准库开发:从寄存器到固件库封装
STM32标准库开发深度解析:从寄存器操作到固件库封装1. 项目概述1.1 系统架构STM32F10xxx系列微控制器基于Cortex-M3内核,其系统结构可分为两大组成部分:内核IP:包含指令存储区总线(I-Code和D-Code)、系统总…...
锅炉水温串级调节系统西门子S7-200 PLC和用组态王6.55联机和仿真程序全套包
锅炉水温串级调节系统西门子S7-200 PLC和用组态王6.55联机和仿真程序全套包,带IO表接线图CAD锅炉水温控制这活儿看起来简单,实操起来全是坑。今天咱们用西门子S7-200 PLC配组态王6.55,搞个带仿真验证的串级调节系统。先说重点:主回…...
告别闪烁!用C语言数学函数实现超平滑LED呼吸灯(附Arduino/STM32代码)
用数学之美打造丝滑LED呼吸灯:从原理到代码实战 呼吸灯作为嵌入式开发的"Hello World",看似简单却暗藏玄机。传统线性PWM调光常出现亮度突变、过渡生硬的问题,就像楼梯台阶般让人不适。本文将带你用数学函数破解这一难题࿰…...
DanKoe 视频笔记:掌控人生:如何获得你想要的生活
在本教程中,我们将探讨如何摆脱传统教育和工作模式的束缚,通过自我教育、技能构建和项目实践,主动创造并获取你真正想要的生活。我们将分析现有体系的局限,并提供一个清晰的五步行动框架。 传统教育的局限与个人选择 现代教育体…...
音乐格式转换全攻略:QMCDecode破解QQ音乐加密文件处理难题
音乐格式转换全攻略:QMCDecode破解QQ音乐加密文件处理难题 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默…...
Python实战:5步搞定MFCC语音特征提取(附完整代码)
Python实战:5步搞定MFCC语音特征提取(附完整代码) 语音识别技术正以前所未有的速度渗透到智能家居、车载系统和虚拟助手等场景中。作为这项技术的核心,梅尔频率倒谱系数(MFCC)因其对人耳听觉特性的高度模拟…...
