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

smart Spring:自定义注解、拦截器的使用(更新中...)

文章目录

  • 〇、使用自定义注解的好处和工作原理
  • 一、如何使用自定义注解
    • 1.自定义一个注解
    • 2.在类、属性、方法上进行使用
    • 3.元注解
  • 二、使用拦截器的好处和工作原理
  • 三、如何使用拦截器
  • 参考

本博客源码:

〇、使用自定义注解的好处和工作原理

自定义注解是Java语言提供的一种元编程(metaprogramming)机制,它允许开发者在代码中添加自己的元数据(metadata),以便在程序运行时进行解析和处理。 通过注解我们可以免去繁琐的配置过程,简化开发流程,可以解决很多实际开发过程中的痛点、难点,让我们可以提出更多更合理的非侵入式解决方案。 以下是一些使用自定义注解的原因和好处:

  1. 提供额外的元数据:自定义注解可以通过在源代码中添加额外的元数据,用于描述类、方法、字段等程序元素的特性和属性。这些元数据可以被程序在运行时获取,以改变程序的行为或提供其他功能。

  2. 简化代码和提高可读性:通过自定义注解,可以将一些复杂的逻辑或配置信息从代码中抽离出来,以注解的形式进行声明和使用。这样可以减少代码的重复性,使代码更加简洁和易读。

  3. 可以通过注解处理器实现代码自动化:Java提供了注解处理器(Annotation Processor)的API,可以用于在编译时处理注解。通过编写自定义的注解处理器,可以根据注解生成额外的代码或进行其他代码转换和生成操作,实现代码自动生成、自动化配置等功能。

  4. 支持框架和库的扩展性:很多开源框架和库都提供了一些特定的自定义注解,用于扩展和定制它们的行为。通过使用框架或库提供的自定义注解,可以更灵活地利用其功能和特性,以满足具体的需求。

  5. 实现代码级别的验证和约束:自定义注解可以用于实现一些代码级别的验证和约束。通过在目标元素上添加注解,可以为该元素定义一些验证规则,如参数非空检查、权限校验等。在编译器或运行时,可以根据注解对代码进行静态或动态的验证,以提高代码的健壮性和安全性。

总的来说,自定义注解是一种扩展Java语言的机制, 能够为程序添加额外的元数据、简化代码、实现自动化和增强可读性等优势。它在许多框架、库和工具中得到了广泛的应用,以提供更灵活和强大的功能。

自定义注解的工作原理大致如下:

  1. 定义注解类,指定注解的保留策略和应用目标等元数据,并定义属性。
  2. 在代码中使用注解修饰目标元素(类、方法、字段等)。
  3. 通过反射机制,获取目标元素上的注解信息。
  4. 根据注解的属性值进行相应的处理逻辑。

一、如何使用自定义注解

1.自定义一个注解

import java.lang.annotation.*;@Documented
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface NameAnnotation {String name() default "未识别的名称";
}

2.在类、属性、方法上进行使用

import tracy.annotation.NameAnnotation;import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;@NameAnnotation(name = "学生类")
@Data
@AllArgsConstructor
public class Student {@NameAnnotation(name = "姓名属性")private String name;@NameAnnotation(name = "年龄属性")private Integer age;@NameAnnotation(name = "性别属性")private String gender;@NameAnnotation(name = "打印方法")public void print(boolean detailed){if(detailed){System.out.println(this.toString());}else{System.out.println("学生"+this.name);}}public static void main(String[] args) {//创建了一个Student对象并打印相关信息Student student=new Student("tracy",18,"female");student.print(true);//打印该对象所属类的相关信息System.out.println("类信息:");System.out.println((student.getClass().getAnnotation(NameAnnotation.class)).name());System.out.println("方法信息:");for(Method method:student.getClass().getDeclaredMethods()){for (Annotation a:method.getAnnotations()){System.out.println(((NameAnnotation)a).name());}}System.out.println("属性信息:");for(Field field:student.getClass().getDeclaredFields()){for (Annotation a:field.getAnnotations()){System.out.println(((NameAnnotation)a).name());}}}
}
  • 执行结果:

在这里插入图片描述

3.元注解

在 Spring Boot 中,可以使用一些自定义注解的元注解来定义和扩展自定义注解。以下是一些常见的元注解:

  1. @Retention:该元注解用于指定注解的保留策略,决定注解的生命周期。常见的参数有:

    • RetentionPolicy.SOURCE:注解仅保留在源代码中,不会对编译后的字节码文件和运行时产生影响。
    • RetentionPolicy.CLASS:注解会保留在编译后的字节码文件中,但不会被加载到 JVM 中运行。
    • RetentionPolicy.RUNTIME:注解会保留在编译后的字节码文件中,并且可以被加载到 JVM 中运行时使用。
  2. @Target:该元注解用于指定注解可以应用的目标元素类型,如类、方法、字段等。常见的参数有:

    • ElementType.TYPE:类、接口或枚举。
    • ElementType.METHOD:方法。
    • ElementType.FIELD:字段。
  3. @Inherited:该元注解用于指定注解是否可以被继承。如果一个类使用了被 @Inherited 注解修饰的注解,则其子类也会继承该注解。

  4. @Documented:该元注解用于指定注解是否应该被 javadoc 文档化。没有 @Documented 元注解修饰的注解在生成 javadoc 文档时不会显示在文档中。

  5. @Repeatable:该元注解用于指定注解是否可重复应用于同一元素上。需要在自定义的重复注解上添加 @Repeatable 注解,并指定一个容器注解来存放重复的注解。

二、使用拦截器的好处和工作原理

三、如何使用拦截器

参考

https://blog.csdn.net/qq_54936371/article/details/122576023
https://zhuanlan.zhihu.com/p/468882010

相关文章:

smart Spring:自定义注解、拦截器的使用(更新中...)

文章目录 〇、使用自定义注解的好处和工作原理一、如何使用自定义注解1.自定义一个注解2.在类、属性、方法上进行使用3.元注解 二、使用拦截器的好处和工作原理三、如何使用拦截器参考 本博客源码: 〇、使用自定义注解的好处和工作原理 自定义注解是Java语言提供的…...

php导出pdf

插件官网:TCPDF 博主用的是tp6框架 、tcpdf插件 composer require tecnickcom/tcpdf --ignore-platform-reqs 后面是忽略平台要求的参数 ---------------中文乱码start------------------ 关于中文乱码问题: 网上说的下载字体放入fonts 利用tools…...

【ECMAScript6_2】字符串

1、字符的Unicode表示法 ES6 加强了对 Unicode 的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。(\u0000-\uFFFF) 码点超过取值范围之后不能正确解读,但是只要给码点加上{}就可以正确解读。 …...

37.RocketMQ之Broker消息存储源码分析

highlight: arduino-light 消息存储文件 rocketMQ的消息持久化在我们在搭建集群时都特意指定的文件存储路径,进入指定的store目录下就可以看到。 下面介绍各文件含义 CommitLog 存储消息的元数据。produce发出的所有消息都会顺序存入到CommitLog文件当中。 CommitLog由多个文件…...

RabbitMq应用延时消息

一.建立绑定关系 package com.lx.mq.bind;import com.lx.constant.MonitorEventConst; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annota…...

【WEB自动化测试】- 浏览器操作方法

一、常用方法 1. maximize_window() 最大化窗口 (重点) 说明:如果能够在打开页面时,全屏显示页面,就能尽最大可能加载更多的页面,提高可定位性 2. set_window_size(width, height) 设置浏览器窗口的大小 (了解) 场景&#xff1…...

VSCode设置鼠标滚轮滑动设置字体大小

1:打开"文件->首选项->设置 2 :打开settings.json文件 英文版这里有个坑 一般点击我下图右上角那个{ } 就可以打开了 在 设置的json 文件中加入如下 “editor.mouseWheelZoom”: true { “editor.mouseWheelZoom”: true, “json.schemas”: [ ]}...

Spring MVC是什么?详解它的组件、请求流程及注解

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 前言 本文将讲解Spring MVC是什么,它的优缺点与九大组件,以及它的请求流程与常用的注解。 目录 一、Spring MVC是什…...

基于Spring Boot的广告公司业务管理平台设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的广告公司业务管理平台设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 后端:Java springboot框架 …...

docker 基本命令安装流程

docker 基本命令安装流程 1.更新Ubuntu的apt源索引 $ sudo apt-get update2.安装包允许apt通过HTTPS使用仓库 $ sudo dpkg --configure -a $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common3.添加Docker官方GPG key $ curl -f…...

尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…...

【LeetCode每日一题合集】2023.7.3-2023.7.9

文章目录 2023.7.3——445. 两数相加 II(大数相加/高精度加法)2023.7.4——2679. 矩阵中的和2023.7.5——2600. K 件物品的最大和(贪心)代码1——贪心模拟代码2——Java一行 2023.7.6——2178. 拆分成最多数目的正偶数之和&#x…...

java企业工程项目管理系统平台源码

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...

软件设计模式与体系结构-设计模式-行为型软件设计模式-访问者模式

目录 二、访问者模式概念代码类图实例一:名牌运动鞋专卖店销售软件实例二:计算机部件销售软优缺点适用场合课程作业 二、访问者模式 概念 对于系统中的某些对象,它们存储在同一个集合中,具有不同的类型对于该集合中的对象&#…...

【LeetCode】503. 下一个更大元素 II

503. 下一个更大元素 II(中等) 方法:单调栈 「 对于找最近一个比当前值大/小」的问题,都可以使用单调栈来解决。栈可以很好的保存原始位置,最近影射栈顶。题目要求更大,因此更大即解–出栈,更小…...

使用infura创建以太坊网络

创建账号 https://www.infura.io/zh 进入控制台Dashboard,选择CREATE API KEY 创建成功后,进入API KEY查看,使用PostMan测试 返回result即为当前区块。...

TCP/IP协议是什么?

78. TCP/IP协议是什么? TCP/IP协议是一组用于互联网通信的网络协议,它定义了数据在网络中的传输方式和规则。作为前端工程师,了解TCP/IP协议对于理解网络通信原理和调试网络问题非常重要。本篇文章将介绍TCP/IP协议的概念、主要组成部分和工…...

python图像处理实战(三)—图像几何变换

🚀写在前面🚀 🖊个人主页:https://blog.csdn.net/m0_52051577?typeblog 🎁欢迎各位大佬支持点赞收藏,三连必回!! 🔈本人新开系列专栏—python图像处理 ❀愿每一个骤雨初…...

学习vue2笔记

学习vue2笔记 文章目录 学习vue2笔记脚手架文件结构关于不同版本的Vuevue.config.js配置文件ref属性props配置项mixin(混入)插件scoped样式总结TodoList案例webStorage组件的自定义事件全局事件总线(GlobalEventBus)消息订阅与发布(pubsub&am…...

【SQL】查找多个表中相同的字段

--查找字段所在 SELECTbb.TABLE_NAME,bb.COLUMN_NAME ,aa.COLUMN_ID,aa.DATA_TYPE,aa.DATA_LENGTH ,bb.COMMENTS FROMuser_tab_cols aa JOIN user_col_comments bb ONaa.TABLE_NAME bb.TABLE_NAMEAND aa.COLUMN_NAME bb.COLUMN_NAME JOIN dba_objects cc ONbb.TABLE_NAME cc…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...