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

spring 自定义注解实现

实现自定义注解,通常会结合AOP(面向切面编程)来创建一个自定义的行为。

下面创建一个名为@MyCustomAnnotation的自定义注解,并使用AOP编写一个切面来处理这个注解。

1. 创建自定义注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 自定义注解,用于标记需要特殊处理的方法。*/
@Target(ElementType.METHOD) // 限制注解只能应用于方法
@Retention(RetentionPolicy.RUNTIME) // 注解将在运行时保留,以便AOP可以访问
public @interface MyCustomAnnotation {String value() default ""; // 可选的参数
}

2. 创建一个切面类来处理这个注解

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class MyCustomAnnotationAspect {/*** 环绕通知,用于处理被@MyCustomAnnotation标记的方法。* @param joinPoint 当前执行的连接点,包含方法信息。* @return 方法的返回值。* @throws Throwable 如果方法执行过程中抛出异常。*/@Around("@annotation(com.example.myapp.MyCustomAnnotation)")public Object handleMyCustomAnnotation(ProceedingJoinPoint joinPoint) throws Throwable {// 在方法执行前的逻辑,例如日志记录System.out.println("开始处理 " + joinPoint.getSignature());// 继续执行被拦截的方法,即执行目标方法Object result = joinPoint.proceed();// 在方法执行后的逻辑,例如清理工作System.out.println("结束处理 " + joinPoint.getSignature());return result;}
}

3. 在需要特殊处理的方法上使用自定义注解

@Service
public class MyService {@MyCustomAnnotationpublic void doSomethingSpecial() {// 这里执行特殊逻辑System.out.println("执行特殊逻辑...");}
}

确保Spring配置文件(如果是XML配置)或Spring Boot的配置(如果是Java配置)启用了AOP和组件扫描。在Spring Boot中,通常@SpringBootApplication已经包含了@EnableAspectJAutoProxy,所以不需要额外配置。

现在,每次调用doSomethingSpecial方法时,MyCustomAnnotationAspect的handleMyCustomAnnotation方法会在调用前后执行,实现了自定义的行为。

这是一个简单的案例,实际的自定义注解可能包含更复杂的逻辑,比如根据注解参数进行不同处理,或者涉及数据库操作、缓存管理等。主要还是需要了解自定义注解的原理。参考:

Java反射+自定义注解+aop事务_注解加反射实现aop-CSDN博客

自定义注解实现原理_自定义注解的实现原理-CSDN博客

相关文章:

spring 自定义注解实现

实现自定义注解,通常会结合AOP(面向切面编程)来创建一个自定义的行为。 下面创建一个名为MyCustomAnnotation的自定义注解,并使用AOP编写一个切面来处理这个注解。 1. 创建自定义注解: import java.lang.annotation…...

10.dockerfile自动构建镜像

dockerfile自动构建镜像 类似ansible剧本,大小几kb 手动做镜像:大小几百M 首先创建一个dockerfile的路径,便于在路径下存在多个路径每个路径下都是dockerfile命名的脚本 注释:文件必须为:dockerfile或者Dockerfile …...

python -- series和 DataFrame增删改数据

学习目标 知道df添加新列的操作 知道insert函数插入列数据 知道drop函数删除df的行或列数据 知道drop_duplicates函数对df或series进行数据去重 知道unique函数对series进行数据去重 知道apply函数的使用方法 1 DataFrame添加列 注意:本文用到的数据集在文章顶部 1.1 直…...

window.clearInterval(timer) 清除定时器

window.clearInterval(timer)是用来清除定时器的方法。在JavaScript中,使用定时器可以在指定的时间间隔执行一段代码。通常,使用setTimeout()方法可以在一定时间后执行一次代码,而使用setInterval()方法可以在每个时间间隔执行一次代码。 使…...

Java项目如何外发告警日志到企业微信

前言 最近领导交代了一个需求,就是有些许客户不单单满足平台告警日志外发到邮箱、短信的形式,还要以消息聊天的形式外发给企业微信。 具体操作 1、注册企业微信。 2、登录企业微信,找到应用管理,创建应用。 3、创建完之后需要记录以下图片中两个值的信息。 4、然后记录下…...

NLP--关键词

在去停用词后的文本中进行词频统计和关键词统计以及词云图显示,来进行文本的关键词提取,让人一目了然。 1.词频统计 统计文本中多次出现的词语,来寻找文章中的关键词,因为多次出现很可能就是关键内容。调用统计数量的Counter库和…...

Qt5学习笔记

一、基础知识 1、基本控件类型 水平弹簧与垂直弹簧的父类都是QSpaceItem。关于PushButton相关的控件类型: QPushButton:最基础的按钮类型。QToolButton:可以控制图片、文字任意组合的显示方式的按钮类型。QRadioButton:就像rad…...

数据结构与算法笔记:基础篇 - 散列表(下):为什么散列表和链表经常会一起使用?

概述 已经学习了这么多章节了,你有没有发现,两种数据结构,散列表和链表,经常会被放在一起使用。你还记得,前面的章节中都有哪些地方讲到散列表和链表的组合使用吗? 在链表那一节,我讲到如何用…...

读AI未来进行式笔记06自动驾驶技术

1. 跃层冲击 1.1. 每个社会其实都处于不同的楼层,往往处于更低楼层的社会,要承受来自更高楼层的社会发展带来的更大冲击 2. 驾驶 2.1. 开车时最关键的不是车,而是路 2.2. 人是比机器更脆弱的生命&am…...

SpringAOP 常见应用场景

文章目录 SpringAOP1 概念2 常见应用场景3 AOP的几种通知类型分别有什么常见的应用场景4 AOP实现 性能监控4.1 首先,定义一个切面类,用于实现性能监控逻辑:4.2 定义自定义注解4.3 注解修饰监控的方法 5 AOP实现 API调用统计5.1 定义切面类&am…...

html+css示例

HTML HTML(超文本标记语言)和CSS(层叠样式表)是构建和设计网页的两种主要技术。HTML用于创建网页的结构和内容,而CSS用于控制其外观和布局。 HTML基础 HTML使用标签来标记网页中的不同部分。每个标签通常有一个开始…...

Day51 动态规划part10+Day52 动态规划part11

LC121买卖股票的最佳时机(未掌握) 暴力:双层循环寻找最优间距,每一次都确定一个起点,遍历剩余节点当作终点 贪心:取最左最小值,不断遍历那么得到的差值最最大值就是最大利润。 动态规划 dp数组…...

Wireshark自定义Lua插件

背景: 常见的抓包工具有tcpdump和wireshark,二者可基于网卡进行抓包:tcpdump用于Linux环境抓包,而wireshark用于windows环境。抓包后需借助包分析工具对数据进行解析,将不可读的二进制数转换为可读的数据结构。 wires…...

商城项目【尚品汇】07分布式锁-2 Redisson篇

文章目录 1 Redisson功能介绍2 Redisson在Springboot中快速入门(代码)2.1 导入依赖2.2 Redisson配置2.3 将自定义锁setnx换成Redisson实现(可重入锁) 3 可重入锁原理3.1 自定义分布式锁setnx为什么不可以重入3.2 redisson为什么可…...

Adobe Illustrator 矢量图设计软件下载安装,Illustrator 轻松创建各种矢量图形

Adobe Illustrator,它不仅仅是一个简单的图形编辑工具,更是一个拥有丰富功能和强大性能的设计利器。 在这款软件中,用户可以通过各种精心设计的工具,轻松创建和编辑基于矢量路径的图形文件。这些矢量图形不仅具有高度的可编辑性&a…...

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:中国舰船研究院

中国舰船研究院又称中国船舶重工集团公司第七研究院,隶属于中国船舶重工集团公司,是专门从事舰船研究、设计、开发的科学技术研究机构,是中国船舶重工集团公司的军品技术研究中心、科技开发中心;主要从事舰船武器装备发展战略研究…...

双网卡配置IP和路由总结

1.在网络适配器属性IPv4中设置默认网关(记网关地址为A),将会在本地路由表中新增一条记录: 网络号子网掩码网关地址0.0.0.00.0.0.0A 2.如果有两个网卡(假设一个连接内网,一个连接互联网)&#…...

【纯血鸿蒙】——自适应布局如何实现?

界面级一多能力有 2 类: 自适应布局: 略微调整界面结构 响应式布局:比较大的界面调整 本文章先主要讲解自适应布局,响应式布局再后面文章再细讲。话不多说,开始了。 自适应布局 针对常见的开发场景,方舟开发框架提…...

Qt5学习笔记(一):Qt Widgets Application项目初探

笔者长期使用MFC开发Windows GUI软件。随着软件向Linux平台迁移的趋势越发明朗,GUI程序的跨平台需求也越来越多。因此笔者计划重新抓一下Qt来实现跨平台GUI程序的实现。 0x01. 看看Qt Widgets Application项目结构 打开Qt5,点击“ New”按钮新建项目。…...

Linux网络编程:数据链路层协议

目录 前言: 1.以太网 1.1.以太网帧格式 1.2.MTU(最大传输单元) 1.2.1.IP协议和MTU 1.2.2.UDP协议和MTU 1.2.3.TCP协议和MTU 2.ARP协议(地址解析协议) 2.1.ARP在局域网通信的角色 2.2.ARP报文格式 2.3.ARP报文…...

公司内部业务系统,其实无需专门开发,用免费低代码平台就够了

这段时间陆续试了几款主流低代码工具,整体体验下来,有些平台在免费阶段就已经很好用了。整理了一份我觉得比较值得尝试的清单,分享给同样有需求的人。斑斑AI首先是斑斑AI。它给我最大的感受就是“没有限制”。完全无限制免费这一点非常少见&a…...

【声音克隆】Qwen3-TTS-12Hz-1.7B-Base优化技巧:如何生成更自然、更逼真的语音

【声音克隆】Qwen3-TTS-12Hz-1.7B-Base优化技巧:如何生成更自然、更逼真的语音 1. 理解Qwen3-TTS的核心能力 1.1 多语言与方言支持 Qwen3-TTS-12Hz-1.7B-Base模型支持10种主要语言和多种方言风格,包括中文、英文、日文等。这种广泛的语言覆盖能力使其…...

别再死记命令了!用EVE-NG模拟器5分钟搞定思科GRE隧道(附OSPF联动配置)

5分钟玩转思科GRE隧道:EVE-NG实战中的高效学习法 第一次在EVE-NG里搭建GRE隧道时,我盯着满屏的命令行发呆——这些配置到底在做什么?为什么tunnel接口要配源和目的地址?OSPF又是怎么和隧道联动的?直到我用Wireshark抓到…...

RWKV7-1.5B-g1a惊艳案例:将复杂段落压缩为三条逻辑闭环要点

RWKV7-1.5B-g1a惊艳案例:将复杂段落压缩为三条逻辑闭环要点 1. 模型能力展示:从复杂到简洁的文本处理 RWKV7-1.5B-g1a作为一款轻量级文本生成模型,在信息压缩和提炼方面展现出令人惊喜的能力。我们通过一个实际案例来展示它如何将复杂内容转…...

终极指南:GoldHEN Cheats Manager - PlayStation 4游戏作弊代码完整管理方案

终极指南:GoldHEN Cheats Manager - PlayStation 4游戏作弊代码完整管理方案 【免费下载链接】GoldHEN_Cheat_Manager GoldHEN Cheats Manager 项目地址: https://gitcode.com/gh_mirrors/go/GoldHEN_Cheat_Manager GoldHEN Cheats Manager 是一款专为PlaySt…...

HunyuanVideo-Foley效果展示:火车进站音效+月台场景视频生成实录

HunyuanVideo-Foley效果展示:火车进站音效月台场景视频生成实录 1. 效果展示开场 想象一下这样的场景:一列蒸汽火车缓缓驶入月台,伴随着汽笛声、铁轨摩擦声和人群嘈杂声。现在,通过HunyuanVideo-Foley技术,我们可以一…...

RAG开发

LangChain通用提示词模板:from langchain_core.prompts import PromptTemplate from langchain_community.llms import Tongyiprompt_template PromptTemplate.from_template("我的邻居姓{lastname},刚生了{gender}" )prompt_template.format(lastname …...

大模型进阶必看:Agent Skills如何让AI开发更标准化、可复用?速收藏!

随着AI应用开发成熟,工具调用经历了Function Calling、MCP协议到Agent Skills三个阶段。Agent Skills通过文件系统原生设计,将指令、工作流和资源打包成可复用模块,革新上下文管理,实现代码即工具,摆脱供应商锁定。它使…...

OpenClaw跨平台脚本:nanobot统一管理mac与Windows文件

OpenClaw跨平台脚本:nanobot统一管理mac与Windows文件 1. 为什么需要跨平台文件管理 在日常工作中,我经常需要在macOS和Windows双系统间切换。最让我头疼的就是文件路径的兼容性问题——macOS使用正斜杠/而Windows使用反斜杠\。每次写脚本都要为不同平…...

提升开发效率:用快马一键生成快速排序多版本性能对比工具

今天在优化一个数据处理模块时,遇到了需要选择合适排序算法的问题。不同数据特征下,快速排序的各种变体表现差异很大,手动测试效率实在太低。于是我用InsCode(快马)平台快速搭建了一个性能对比工具,整个过程比想象中简单很多。 需…...