当前位置: 首页 > news >正文

【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,并且访问不同域名,显示不同主页&#xf…...

关于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文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么&#xff…...

设计模式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.堆排序 想法⼀&#xff1a; 基于已有数组建堆、取堆顶元素完成排序。也就是利用写好的堆数据结构&#xff08;之前的文章有讲解&#xff09;&#xff0c;去实现排序。 void HeapSort(int* a, int n){HP hp;for(int i 0; i < n; i){HPPush(&hp,a[i]);}int i 0;whi…...

探秘 MySQL 数据类型的艺术:性能与存储的精妙平衡

文章目录 前言&#x1f380;一、数据类型分类&#x1f380;二、整数类型&#xff08;举例 TINYINT 和 INT &#xff09;&#x1f3ab;2.1 TINYINT 和 INT 类型的定义2.1.1 TINYINT2.1.2 INT &#x1f3ab;2.2 表的操作示例2.2.1 创建包含 TINYINT 和 INT 类型的表2.2.2 插入数据…...

使用任意绘图软件自学并结合上课所学内容完成数据库原理图绘制

本次绘图采用亿图图示软件...

static、 静态导入、成员变量的初始化、单例模式、final 常量(Content)、嵌套类、局部类、抽象类、接口、Lambda、方法引用

static static 常用来修饰类的成员&#xff1a;成员变量、方法、嵌套类 成员变量 被static修饰&#xff1a;类变量、成员变量、静态字段 在程序中只占用一段固定的内存&#xff08;存储在方法区&#xff09;&#xff0c;所有对象共享可以通过实例、类访问 (一般用类名访问和修…...

基于SSM的智能养生平台管理系统源码带本地搭建教程

技术栈与架构 技术框架&#xff1a;采用SSM&#xff08;Spring Spring MVC MyBatis&#xff09;作为后端开发框架&#xff0c;结合前端技术栈layui、JSP、Bootstrap与jQuery&#xff0c;以及数据库MySQL 5.7&#xff0c;共同构建项目。 运行环境&#xff1a;项目在JDK 8环境…...

Latex中文排版字体和字号

中文排版 最近常用latex排版&#xff0c;也遇到了很多问题。这里对于主要的参考文章做一个总结和推荐。 一份不太简短的 LaTeX2ε 介绍【中文资料】ctex宏包用户手册&#xff0c;用户手册使用 命令行texdoc ctex 这两个文档都是中文的&#xff0c;而且几乎解决了我90%的排版…...

[C++ 11] 列表初始化:轻量级对象initializer_list

C发展历史 C11是C语言的第二个主要版本&#xff0c;也是自C98以来最重要的一次更新。它引入了大量的新特性&#xff0c;标准化了已有的实践&#xff0c;并极大地改进了C程序员可用的抽象能力。在2011年8月12日被ISO正式采纳之前&#xff0c;人们一直使用“C0x”这个名称&#…...

【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (八):API说明(暂时完结,后续考虑将在线版mongoDB变为本地版)

本项目旨在学习如何快速使用 nodejs 开发后端api&#xff0c;并为以后开展其他项目的开启提供简易的后端模版。&#xff08;非后端工程师&#xff09; 由于文档是代码写完之后&#xff0c;为了记录项目中需要注意的技术点&#xff0c;因此文档的叙述方式并非开发顺序&#xff0…...

manictime整合两个数据库的数据

作用 老电脑崩溃了,有个1t.db&#xff0c; 新电脑有个3t.db 那么重装系统后就想整合起来用。 整合前文件大小 整合命令 .\mtdb.exe importtimelines -sdbpa ManicTimeCore-1t.db -dbpa ManicTimeCore-3t.db -tt ManicTime/ComputerUsage,ManicTime/Applications,ManicTime…...

Spring Boot植物健康系统:智慧农业的新趋势

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…...

(三)第一个Qt程序“Qt版本的HelloWorld”

一、随记 我们在学习编程语言的时候&#xff0c;各种讲解编程语言的书籍中通常都会以一个非常经典的“HelloWorld”程序展开详细讲解。程序虽然简短&#xff0c;但是“麻雀虽小&#xff0c;五脏俱全”&#xff0c;但是却非常适合用来熟悉程序结构、规范&#xff0c;快速形成对编…...

【Python知识】一个强大的数据分析库Pandas

文章目录 Pandas概述1. 安装 Pandas2. 基本数据结构3. 数据导入和导出4. 数据清洗5. 数据选择和过滤6. 数据聚合和摘要7. 数据合并和连接8. 数据透视表9. 时间序列分析10. 数据可视化 &#x1f4c8; 如何使用 Pandas 进行复杂的数据分析&#xff1f;1. 数据预处理2. 处理缺失值…...

10.26学习

1.整形的定义和输出 在C语言中&#xff0c;整形&#xff08;Integer&#xff09;是一种基本数据类型&#xff0c;用于存储整数。整形变量可以是正数、负数或零。在定义和输出整形变量时&#xff0c;需要注意以下几点&#xff1a; ①定义整形变量&#xff1a; 使用 int 关键字…...

CSS易漏知识

复杂选择器可以通过&#xff08;id的个数&#xff0c;class的个数&#xff0c;标签的个数&#xff09;的形式&#xff0c;计算权重。 如果我们需要将某个选择器的某条属性提升权重&#xff0c;可以在属性后面写!important&#xff1b;注意!importent要写在;前面 很多公司不允许…...

【10天速通Navigation2】(三) :Cartographer建图算法配置:从仿真到实车,从原理到实现

前言 往期内容&#xff1a; 第一期&#xff1a;【10天速通Navigation2】(一) 框架总览和概念解释第二期&#xff1a;【10天速通Navigation2】(二) &#xff1a;ROS2gazebo阿克曼小车模型搭建-gazebo_ackermann_drive等插件的配置和说明 本教材将贯穿nav2的全部内容&#xff0c…...

博彩类网站开发源代码/百度知道app官方下载

题面 题解 解法一 这个思路要基于以下一个结论&#xff1a; 当你删掉某条边\((x,x1)\)时&#xff0c;最短路路线为&#xff1a;\(1\to x(\leq u)\to y(>u) \to n\),并且\(x\to y\)一定不会属于原最短路。 我们枚举删掉最短路上的哪条边&#xff0c;然后把这条边的\(s\)加进队…...

企业营销策划书模板/百度搜索优化

第1章-1.0 工具包 本章介绍Android软件开发工具包&#xff08;SDK&#xff09;及一些可能用到的相关软件的安装方法。最后&#xff0c;我们将可以在一个模拟器上运行简单的“Hello World”程序。在Windows、Mac OS X和Linux这几个系统上都可以进行Android应用开发。下面将载入该…...

济南网站建设 选聚搜网络/百度一下 你就知道官网

中国咖啡市场潜力到底有多大&#xff1f;一则数据就可说明&#xff01;据NCBD数据显示&#xff0c;2021年中国现制咖啡市场规模为924.5亿元&#xff0c;与咖啡相关的企业成立数达到2.6万家&#xff0c;门店数已突破12万家。预计到2025年&#xff0c;中国现制咖啡市场规模将突破…...

地税网站建设管理/怎么打广告吸引客户

由于博客是写给自己看的&#xff0c;所以用到了大量简写题也没有写出来&#xff0c;有需要的可以联系我要题目的pdf,本章ppt,讲义以及题目测试数据&#xff0c;由于上传不方便我就不上传了&#xff0c;联系邮箱SindarDawn163.com 注&#xff1a;数列样式从0开始 小知识&#xf…...

设计师可以做兼职的网站/种子搜索引擎

点击上方“蓝色字”可关注我们&#xff01;暴走时评&#xff1a;日本最大的海运公司之一Nippon Yusen K.K.&#xff08;NYK&#xff09;正计划发行自己的数字货币。数字货币将提供给员工&#xff0c;以简化管理和运输&#xff0c;让员工更容易兑换当地货币。据称这种货币将与美…...

专业机票网站建设/网站站点

贴一个博客地址&#xff1a; 、http://www.cnblogs.com/CCBB/archive/2009/04/25/1443455.html 讲的很详细。 5-1 最大子列和问题 (20分) 给定KK个整数组成的序列{ N_1N​1​​, N_2N​2​​, ..., N_KN​K​​ }&#xff0c;“连续子列”被定义为{ N_iN​i​​, N_{i1}N​i1…...