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博客

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

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

相关文章

uc/OS移植到stm32实现三个任务

文章目录 一、使用CubeMX创建工程二、uc/OS移植三、添加代码四、修改代码五、实践结果六、参考文章七、总结 实践内容 学习嵌入式实时操作系统(RTOS),以uc/OS为例,将其移植到stm32F103上,构建至少3个任务(task&#xf…

就业班 第四阶段(k8s) 2401--6.4 day2 Dashboard+国产kuboard(好用)+简单命令

可视化部署Dashboard 昨天做一主两从飞高可用,出现浏览器那一行,是为啥 thisisunsafe kubectl get 获取资源 pod node svc -A 所有名称空间 -n 指定名称空间 -w 动态显示 kubectl edit 资源 pod node svc 官方的,毛坯房 国产 在哪找的…

数字证书和CA

CA(Certificate Authority)证书颁发机构 验证数字证书是否可信需要使用CA的公钥 操作系统或者软件本身携带一些CA的公钥,同时也可以向提供商申请公钥 数字证书的内容 数字证书通常包含以下几个主要部分: 主体信息&#xff08…

uc/OS-III多任务程序

文章目录 一、实验内容二、实验步骤(一)基于STM32CubeMX建立工程(二)获取uc/OS-III源码(三)代码移植 三、修改mai.c文件四、实验现象 一、实验内容 学习嵌入式实时操作系统(RTOS),以…

检测五个数是否一样的算法

目录 算法算法的输出与打印效果输出输入1输入2 打印打印1打印2 算法的流程图总结 算法 int main() {int arr[5] { 0 };int i 0;int ia 0;for (i 0; i < 5; i) { scanf("%d", &arr[i]); }for (i 1; i < 5; i) {if (arr[0] ! arr[i]) {ia 1;break;} }…

2024全国大学生数据统计与分析竞赛B题【电信银行卡诈骗的数据分析】思路详解

电信诈骗是指通过电话、网络和短信方式&#xff0c;编造虚假信息&#xff0c;设置骗局&#xff0c;对受害人实施远程、非接触式诈骗&#xff0c;诱使受害人打款或转账的犯罪行为&#xff0c;通常以冒充他人及仿冒、伪造各种合法外衣和形式的方式达到欺骗的目的&#xff0c;如冒…

C# 异步方法async / await 任务超时处理

一、需求 如果调用一个异步方法后&#xff0c;一直不给返回值结果怎么办呢&#xff1f;这就涉及到怎么取消任务了。 二、Task取消任务 static CancellationTokenSource source new CancellationTokenSource();static void Main(string[] args){Task.Run(() >{for (int i …

Responder工具

简介 Responder是一种网络安全工具&#xff0c;用于嗅探和抓取网络流量中的凭证信息&#xff08;如用户名、密码等&#xff09;。它可以在本地网络中创建一个伪造的服务&#xff08;如HTTP、SMB等&#xff09;&#xff0c;并捕获客户端与该服务的通信中的凭证信息。 Responder工…

路由器作为网络扩展器——设置桥接、路由模式

下面提到的路由器都是家用路由器 一、有线桥接(交换模式) 1.连接示意图 (副路由器只看交换模式部分) 副路由器充当交换机的角色 二、无线桥接(与有线类似) &#xff08;副路由器的无线信号 连接 主路由器的无线信号&#xff09; 三、路由模式 1.连接示意图 (副路由器只看…

扩散模型条件生成——Classifier Guidance和Classifier-free Guidance原理解析

1、前言 从讲扩散模型到现在。我们很少讲过条件生成&#xff08;Stable DIffusion曾提到过一点&#xff09;&#xff0c;所以本篇内容。我们就来具体讲一下条件生成。这一部分的内容我就不给原论文了&#xff0c;因为那些论文并不只讲了条件生成&#xff0c;还有一些调参什么的…

【时序约束】一些关于io输入输出时序约束的实际的参考示例1

在FPGA设计中&#xff0c;I/O输入输出时序约束是确保信号完整性和时序准确性的重要步骤。以下是一些实际的参考示例&#xff0c;展示了如何使用set_input_delay和set_output_delay命令&#xff0c;并提供了如何确定具体约束值的方法。 示例 示例1&#xff1a;输入时序约束 假…

Java数据结构与算法(最大子数组和动态规划)

前言 动态规划主要用于解决具有重叠子问题和最优子结构性质的问题。它通过将问题分解为子问题来解决复杂问题&#xff0c;每个子问题仅解决一次&#xff0c;并将其结果存储&#xff0c;以供后续使用&#xff0c;从而避免了重复计算。 对应leetcode. - 力扣&#xff08;LeetCo…

Linux统计目录和文件数目

当在终端执行 ls | wc 命令时&#xff0c;ls 命令列出了当前目录中的文件和目录&#xff0c;然后通过管道 | 将输出传递给 wc 命令进行计数。 wc 命令的默认输出包括三列&#xff1a; 行数&#xff08;lines&#xff09;&#xff1a;这通常是文件和目录的总数&#xff0c;但注…

【python】python电影评论数据抓取分析可视化(源码+数据+课程论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

PVc是k8s的什么?

**PVC&#xff08;PersistentVolumeClaim&#xff09;是Kubernetes&#xff08;k8s&#xff09;中的持久化存储卷声明**。它是用户对存储的请求&#xff0c;类似于Pod消耗节点资源的方式&#xff0c;PVC则消耗PV&#xff08;Persistent Volume&#xff0c;持久化卷&#xff09;…

探索教研在线平台的系统架构

教研在线平台作为一家致力于教育技术领域的企业&#xff0c;其系统架构扮演着至关重要的角色。本文将深入探讨教研在线平台的系统架构&#xff0c;从技术架构、数据架构和安全架构等方面进行分析&#xff0c;以期帮助读者更好地理解这一教育科技平台的运作模式。 技术架构是教研…

银河麒麟操作系统通过首批软件供应链安全能力认证

麒麟软件产品供应链安全能力获双重肯定&#xff01;5月30日&#xff0c;经北京赛迪认证中心评估&#xff0c;银河麒麟高级服务器操作系统V10和银河麒麟桌面操作系统V10成为首批获得软件供应链安全能力认证产品&#xff0c;并在操作系统类产品中名列前茅。 软件供应链安全能力评…

常用的国内外公共DNS服务

DNS介绍 DNS&#xff08;全称&#xff1a;Domain Name Service&#xff0c;域名系统&#xff09;&#xff0c;是互联网的核心服务之一&#xff0c;将便于记忆的网址&#xff08;域名&#xff09;和不便记忆的IP地址相互对应&#xff0c;方便普通用户更便捷地访问互联网。 通常…

MP4文件格式

ISO 协议族 ISO/IEC-14496:MPEG-4 协议族,包括 ISO 容器格式、MPEG-4(H.264)视频压缩标准等。ISO/IEC-23008:MPEG-H 协议族,包括 H.265(HEVC)视频压缩标准等。字段类型含义ISO/IEC-14496-1SystemMPEG-4 的复用、同步等系统级特性ISO/IEC-14496-2Video视频压缩标准ISO/I…

一些JVM面试题

Java垃圾回收器的原理 有三对常见的垃圾回收器&#xff1a; 在JDK1.8之前&#xff0c;有三种常见的垃圾回收器&#xff0c; serial serialOld 串行化的垃圾回收 PS PO 多线程并行回收&#xff0c;可以动态调整堆内存的大小&#xff0c;关注系统的吞吐量 ParNew CMS Par…