spring自定义注解之-ElementType.METHOD方法级注解声明

自定义注解类型和常用场景

可以参考之前的文章 :
ElementType.FIELD字段级注解声明

如果在项目中,多处地方都需调用到同一个方法进行逻辑处理,且与方法的业务逻辑无关,比如监控,日志等,则可用自定义的方法来实现,使得代码更加简洁、易于维护,提高可读性。

METHOD-自定义方法注解完整步骤

1.定义一个自定义的METHOD注解(可以带参数和不带参数)
2.针对该注解,创建一个切面类,进行逻辑处理
3.如何作用在不同方法上

自定义METHOD注解

@Target(ElementType.METHOD)表示该定义作用在类的方法上。

package com.power.aspect.annotation;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//自定义日志注解,传入参数value
public @interface PowerLog {String value();
}

创建对应的切面类

切面类针对自定义PowerLog注解进行逻辑处理,AOP(面向切面编程)的一种实现,@Around环绕通知,表示在目标方法前后进行额外操作,其他相关内容可以去查看AOP的官方说明。

@Slf4j
@Component
@Aspect
public class PowerLogAspect {@AutowiredLogUtil logUtil;//定义切点,所有使用到@PowerLog的地方,都会被该切面类监控到,并进行处理//@annotation(powerLog) 中的参数需要跟point(PowerLog powerLog)定义的名称一模一样,目前这个都是小写的。@Pointcut("@annotation(com.power.aspect.annotation.PowerLog) && @annotation(powerLog)")public void point(PowerLog powerLog) {}//环绕通知:@Around注解用于在目标方法前后进行额外操作。通过使用该注解可以对目标方法进行包装或者修改其行为。@Around("point(powerLog)")public Object aroundPower(ProceedingJoinPoint point, PowerLog powerLog) throws Throwable {//powerLog注解的value参数值String value = powerLog.value();//1.目前方法之前调用log.info("调用时间1:"+new Date());//2.目标方法调用	Object response = point.proceed();//3.目前方法之后调用,比如记录方法调用日志记录log.info("调用时间2:"+new Date());try {//自定义日志工具类,下面三个参数对应:value日志类型,方法输入对象,返回对象 logUtil.log(value, JSONObject.toJSONString(point.getArgs()), JSONObject.toJSONString(response));} catch (Exception e) {log.error("添加日志报错", e);}return response;}
}

实际调用演示

两个方法都使用了@PowerLog 注解,所有调用方法的操作都会触发注解对应的切面类逻辑,并根据value的参数值(“login”,“logout”)来记录对应的日志。

@RestController
@Slf4j
public class LoginController {@Override@PowerLog("login")public String loginUser(UserDto userDto) {//登录的逻辑return "";}@PowerLog("logout")public String logoutUser(UserDto userDto) {//登出的逻辑return "";}
}

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

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

相关文章

【JavaSE】面向对象——继承性

继承性 继承性的概念 所谓继承,就是程序猿在保持原有类特性的基础上进行扩展,增加新功能,这样的类被称为派生类或者子类,原有类被称为超类或者基类。 在对于继承性概念进行书写前,我曾查阅许多资料来保证对其表达的…

Some collections -- 2024.3

一、TensorFlow Android (dataset: Mnist) We used TensorFlow to define and train our machine learning model, which can recognize handwritten numbers, called a number classifier model in machine learning terminology. We transform the trained TensorFlow mod…

C++学习第五天(内存管理)

1、内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int) * 4);int…

2024.03.01作业

1. 基于UDP的TFTP文件传输 #include "test.h"#define SER_IP "192.168.1.104" #define SER_PORT 69 #define IP "192.168.191.128" #define PORT 9999enum mode {TFTP_READ 1,TFTP_WRITE 2,TFTP_DATA 3,TFTP_ACK 4,TFTP_ERR 5 };void get_…

高维中介数据:基于交替方向乘子法(ADMM)的高维度单模态中介模型的参数估计(入门+实操)

全文摘要 用于高维度单模态中介模型的参数估计,采用交替方向乘子法(ADMM)进行计算。该包提供了确切独立筛选(SIS)功能来提高中介效应的敏感性和特异性,并支持Lasso、弹性网络、路径Lasso和网络约束惩罚等不…

npm 镜像源切换与设置

项目背景 依赖安装中断或响应特别慢。 可以看到当前所用的镜像是 https://registry.npmjs.org 。 切换淘宝镜像之后总算能够安装下来 命令行模式 查看当前镜像源 # 查看当前镜像源 npm config get registry 可以看到默认情况下是官方默认全局镜像 https://registry.npmjs.o…

竞争加剧下,登顶后的瑞幸该做什么?

瑞幸咖啡仅用短短18个月时间从品牌创立到纳斯达克上市,刷新全球最快上市记录。2020年因交易造假事件被勒令退市股价暴跌80%,有人说这个创造了赴美IPO奇迹的“巨婴”将是下一个倒下的ofo。2023年瑞幸咖啡以逆势超速增长领跑咖啡赛道有力回应了市场的质疑&…

Vector中的begin和end函数是左闭右开的区间

vector::end() 函数的语法 vector::end(); 参数&#xff1a; none——它什么都不接受。 返回值&#xff1a; iterator– 它返回一个指向向量的 past-the-end 元素的迭代器。 实际上Vector中的begin和end函数是左闭右开的区间。 例&#xff1a; Input: vector<int>…

Java多线程实现发布和订阅

目录 简介 步骤 1: 定义消息类 步骤 2: 创建发布者 步骤 3: 创建订阅者 步骤 4: 实现发布-订阅模型 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡…

棋牌室计时计费管理系统的灯控器连接教程

棋牌室计时计费管理系统的灯控器连接教程 一、前言 以下教程以 佳易王棋牌室计时计费管理系统软件V18.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;计时计费软件在开始计时的时候&#xff0c;点击 开始计时 如果连接了…

YOLOv9独家改进|动态蛇形卷积Dynamic Snake Convolution与空间和通道重建卷积SCConv与RepNCSPELAN4融合

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 Dynamic Snake Convolution是一种针对细长微弱的局部结构特征与复杂多变的全局形态特征设计的卷积模块。 SCConv是一种即插即用的空间…

华为OD机试真题C卷-篇6

100分值题 宽度最小的子矩阵部门人力分配电脑病毒感染会议室占用时间段 宽度最小的子矩阵 给定一个n行 * m列的矩阵&#xff1b;给定一个k个整数的数组k_list&#xff1b;在n*m的矩阵中找一个宽度最小的子矩阵&#xff0c;该子矩阵包含k_list中所有的整数&#xff1b; 输入描述…

【大数据】Flink SQL 语法篇(九):Window TopN、Deduplication

《Flink SQL 语法篇》系列&#xff0c;共包含以下 10 篇文章&#xff1a; Flink SQL 语法篇&#xff08;一&#xff09;&#xff1a;CREATEFlink SQL 语法篇&#xff08;二&#xff09;&#xff1a;WITH、SELECT & WHERE、SELECT DISTINCTFlink SQL 语法篇&#xff08;三&…

COM - get VARIANT value - .vt = (VT_BSTR | VT_ARRAY)

文章目录 COM - get VARIANT value - .vt (VT_BSTR | VT_ARRAY)概述笔记END COM - get VARIANT value - .vt (VT_BSTR | VT_ARRAY) 概述 取到一个VARIANT值, .vt 0x2008, 查了一下, 0x2008 (VT_BSTR | VT_ARRAY) 查了资料, 这个vt 0x2008是BSTR的数组. 看看咋取值? 网上…

3.2 log |416. 分割等和子集,1049.最后一块石头的重量II,494.目标和

416. 分割等和子集 class Solution { public:bool canPartition(vector<int>& nums) {vector<int> dp(10001,0);int sumaccumulate(nums.begin(),nums.end(),0);if(sum%2) return false;int targetsum/2;for(int i0;i<nums.size();i){for(int jtarget;j>…

项目管理:高效推动项目成功的关键

项目管理&#xff1a;高效推动项目成功的关键 在当今竞争激烈的商业环境中&#xff0c;项目管理已成为企业实现目标和取得成功的关键因素。有效的项目管理不仅能够确保项目按时完成&#xff0c;还能在预算范围内达到预期的质量标准。本文将探讨项目管理的重要性、关键环节以及…

Maven安装并配置本地仓库

一、安装Maven 1.下载链接 Maven官网下载链接 Binary是可执行版本&#xff0c;已经编译好可以直接使用。 Source是源代码版本&#xff0c;需要自己编译成可执行软件才可使用。 tar.gz和zip两种压缩格式,其实这两个压缩文件里面包含的内容是同样的,只是压缩格式不同 tar.gz格…

Stable Video文本生成视频公测地址——Scaling Latent Video Diffusion Models to Large Datasets

近期&#xff0c;Stability AI发布了首个开放视频模型——"Stable Video"&#xff0c;该创新工具能够将文本和图像输入转化为生动的场景&#xff0c;将概念转换成动态影像&#xff0c;生成出电影级别的作品&#xff0c;旨在满足广泛的视频应用需求&#xff0c;包括媒…

STM32 DMA入门指导

什么是DMA DMA&#xff0c;全称直接存储器访问&#xff08;Direct Memory Access&#xff09;&#xff0c;是一种允许硬件子系统直接读写系统内存的技术&#xff0c;无需中央处理单元&#xff08;CPU&#xff09;的介入。下面是DMA的工作原理概述&#xff1a; 数据传输触发&am…

解决Java并发问题的常见思路

写在文章开头 近期对一些比较老的项目进行代码走查&#xff0c;碰到一些极端的并发编程恶习&#xff0c;所以笔者就基于此文演示这类问题以及面对并发编程时我们应该需要了解一些常见套路。 Hi&#xff0c;我是sharkChili&#xff0c;是个不断在硬核技术上作死的java coder&am…