自定义注解,基于redis实现分布式锁

news2024/11/25 15:57:46

一、如何实现自定义注解

1.1、注解的基础知识

实现自定义注解其实很简单,格式基本都差不多。也就参数可能变一变。
@Retention:取值决定了注解在什么时候生效,一般都是取运行时,也就是RetentionPolicy.RUNTIME。
@Target:决定了这个注解可以使用在哪些地方,可以取方法,字段,类等。
注解这就定义完了,不过一个注解最重要的是它实现的功能。这个时候就需要用到切面了,定义一个切面类,定义切点,切点类型就是注解,并填写所定义的注解的路径。

1.2、定义注解

package com.yumoxuan.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
}

1.3、实现切面类

package com.yumoxuan.annotation.Aspect;

import com.alibaba.fastjson.JSONObject;
import com.yumoxuan.utils.LogUtil;
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;

@Component
@Aspect
public class MyAnnotationAspect {
	//定义切点,切点类型是注解,代表用到该注解的方法就会触发相关的通知(通知在后面定义)
    @Pointcut(value = "@annotation(com.yumoxuan.annotation.MyAnnotation)")
    public void pointCut(){

    }
	
	//这种方式可以直接用上面定义的注解切点,前置通知,请求进入controller之前会先调用这个方法
    @Before("pointCut()")
    public void before(JoinPoint joinPoint){
        System.out.println("前置通知开始。。。");
        System.out.println(joinPoint.toString());
        for (int i=0;i<joinPoint.getArgs().length;i++){
            System.out.println(joinPoint.getArgs()[i]);
        }
        System.out.println("前置通知结束。。。");
    }
    
    //直接写全路径注解切点,后置通知,请求进入controller并执行完之后会调用该方法。
   @After(value = "@annotation(com.yumoxuan.annotation.MyAnnotation)")
   public void after(JoinPoint joinPoint){
        System.out.println("后置通知开始");
       System.out.println(joinPoint.toString());
   }
}

1.4、实现controller类

package com.yumoxuan.controller;
import com.yumoxuan.annotation.MyAnnotation;
import com.yumoxuan.pojo.Pub;
import com.yumoxuan.pojo.Result;
import com.yumoxuan.service.PubService;
import com.yumoxuan.utils.LogUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


@RestController
public class PubController {
    @Autowired
    PubService pubService;

    @MyAnnotation
    @ResponseBody
    @RequestMapping("/getpub")
    public Result<Pub> getPub(String userName,Long userNo){
        Result res=Result.ok();
        Pub pub = pubService.getPub();
        if(Objects.nonNull(pub)){
            res.setData(pub);
        }
        return res;
    }
}

这样就定义好了一个自定义注解以及注解的逻辑。在方法上面加上注解,那么在请求进入该方法之前,会先执行前置通知,在执行完controller的方法并返回之前,会先调用后置通知。
我们看看加上注解之后的执行结果。(没加是不会有的)
在这里插入图片描述

二、基于redis实现分布式锁

之前背过分布式锁几种实现方案的八股文,但是并没有真正自己实操过。现在对AOP有了更深一点的理解,就自己来实现一遍。

2.1、分布式锁的基础知识

2.2、

未完待续…

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

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

相关文章

Unreal5 第三人称射击游戏 射击功能实现2

上一篇我们实现了角色射击相关的动画以及切换逻辑&#xff0c;并将武器相关的模型添加到角色身上。 这一篇开始制作武器相关的功能。 制作子弹父类 首先创建一个actor类&#xff0c;命名为BP_Bullet&#xff0c;这个作为子弹的通用父类&#xff0c;在里面创建子弹通用的功能实…

测试相关知识

测试基础知识 1. 测试基本理念2. 软件测试的分类2.1 程序是否运行2.2 测试时间段划分2.3 是否涉及实现2.4 其它测试2.5 当前流程的测试概念 3. 测试设计方法4. 参考书籍 1. 测试基本理念 软件测试的定义&#xff1a;软件测试是使用人工或自动的手段来运行或测定某个软件系统的…

chatgpt赋能python:Python年龄换算:如何根据Python版本算出“年龄”?

Python年龄换算&#xff1a;如何根据Python版本算出“年龄”&#xff1f; Python是一种高级编程语言&#xff0c;享有强大、易读、易用和可扩展性等各种优点。它是许多开发者使用的首选语言&#xff0c;尤其在数据科学和机器学习领域中备受推崇。 但是&#xff0c;Python几乎…

网络安全工具合集

首先&#xff0c;恭喜你发现了宝藏。 本文章集成了全网优秀的开源攻防武器项目&#xff0c;包含&#xff1a; 信息收集工具&#xff08;自动化利用工具、资产发现工具、目录扫描工具、子域名收集工具、指纹识别工具、端口扫描工具、各种插件....etc...&#xff09; 漏洞利用…

轮廓检测及功能

目录 一、实验介绍二、实验步骤三、实验任务任务一&#xff1a;轮廓特征练习一: 找到每个轮廓的方向任务二&#xff1a;边界矩形练习二: 围绕轮廓裁剪图像 一、实验介绍 1. 实验内容 本实验将学习轮廓检测及功能。 2. 实验要点 生成二进制图像来查找轮廓找到并画出轮廓轮廓…

面试题--12

1.MySQL 的内连接、左连接、右连接有什么区别&#xff1f; 2.MySQL 索引是怎么实现的&#xff1f; 3.索引的优点和缺点—查询频率高的字段 4.B树的特点和作用----必须先看 下面的网址 5.什么是聚集索引和非聚集索引 6.索引的分类 7.什么是最左前缀法则以及如何设计最左法则 8.怎…

图论基础和表示

一、概念及其介绍 图论(Graph Theory)是离散数学的一个分支&#xff0c;是一门研究图(Graph)的学问。 图是用来对对象之间的成对关系建模的数学结构&#xff0c;由"节点"或"顶点"(Vertex&#xff09;以及连接这些顶点的"边"&#xff08;Edge&a…

chatgpt赋能python:Python开源免费——为什么它是SEO世界的最佳选择

Python开源免费——为什么它是SEO世界的最佳选择 介绍 Python是一种流行的程序设计语言&#xff0c;拥有众多的开源库和响应式社区。它广泛应用于机器学习、数据科学、Web开发、系统自动化等领域。Python不仅易于学习和使用&#xff0c;而且完全免费并且开源&#xff0c;使得…

Linux线程的同步与互斥(二) 条件变量+信号量

文章目录 二、线程同步条件变量1、条件变量的概念2、同步概念与竞态条件3、条件变量函数初始化4、条件变量函数销毁5、条件变量函数等待6、条件变量函数唤醒等待生产者消费者模型1、理论部分2、“3 2 1”原则3、基于阻塞队列的生产者消费者模型 POSIX信号量1、信号量的概念2、信…

时间序列学习 经典案例(5)【stability_selection】股票数据特征分析与特征选择

0.环境配置 本文用到的环境是&#xff1a; jupyter 略python 3.9stability_selection 略&#xff0c;见下文。scikit-learn 1.2.2seaborn 0.12.2pandas 1.3.5numpy 1.22.3matplotlib 3.6.3tushare 1.2.89baostock 00.8.80yfinance 0.2.18 1.stability_selection模块安装【问…

【MySQL数据库 | 番外篇】 聚合函数

前言&#xff1a; 聚合函数是分组查询中一个重要的组成部分&#xff0c;想要利用分组查询&#xff0c;就要对聚合函数有不错的掌握&#xff0c;因此我们在这里开一篇番外&#xff0c;讲解SQL语法中的聚合函数 聚合函数&#xff1a; 聚合函数是SQL中一种特殊的函数&#xff0c;…

大模型信息提取、文本生成、视觉语音应用

448页新书《基础模型自然语言处理》&#xff0c;详述大模型在信息提取文本生成视觉语音应用。 Dr. Gerhard Paa 等人合著的《Foundation Models for Natural Language Processing》 一书系统介绍基础模型研究和应用的全面概述&#xff0c;而且是目前对此方面研究最新的综述。 …

【Java】Java核心要点总结:59

文章目录 1. 线程的run()和start()有什么区别&#xff0c;为什么不直接调用run()2. synchronized是什么&#xff0c;以及原理3. Java中如何实现多线程的通讯和协作4. Volatile有什么特点&#xff0c;为什么能够保证变量的可见性5. 为什么说synchronized是一个悲观锁&#xff0c…

chatgpt赋能python:Python开发环境的下载方法

Python开发环境的下载方法 Python是一种高级的编程语言&#xff0c;受到广泛的社区和商业支持。它用于数据分析、人工智能和Web开发等领域&#xff0c;成为业界最流行的编程语言之一。搭建Python开发环境需要安装解释器、编辑器、包管理器和库&#xff0c;下面介绍Python开发环…

chatgpt赋能python:用Python开发在线电影播放网站如何进行SEO

用Python开发在线电影播放网站如何进行SEO 随着人们对于电影、电视剧等视频娱乐的需求日益增长&#xff0c;越来越多的在线电影播放网站涌现出来。作为开发者&#xff0c;如何通过搜索引擎优化&#xff08;SEO&#xff09;来使你的在线电影播放网站具有更好的可见度&#xff0…

chatgpt赋能python:如何更新Python库?

如何更新Python库&#xff1f; Python语言已经成为现代编程语言中最受欢迎的一种&#xff0c;它的成功归功于它的灵活性、简洁性和可读性。Python库是它成功的关键&#xff0c;这些库是程序员的基本工具箱&#xff0c;可以更快地编写、测试和部署程序。 然而&#xff0c;Pyth…

多分类问题

目录 多分类问题介绍1 多分类1.1 数据集1.2 数据可视化1.3 逻辑回归的向量化1.3.1 代价函数的向量化1.3.2 梯度的向量化1.3.3 正则化逻辑回归的向量化 1.4 多分类-分类器 1.5 使用分类器进行预测 多分类问题 介绍 在本练习中&#xff0c;我们将使用逻辑回归来识别手写数字&…

python安装使用Flask框架(Vscode)

编译器&#xff1a;VsCode&#xff0c;python3.** 首先安装&#xff0c;在终端输入 pip install flask安装成功后新建文件&#xff0c;app.python&#xff0c;创建一个简单的Web应用。 from flask import Flaskapp Flask(__name__)app.route(/) def hello():return Hello, …

chatgpt赋能python:Python平均值命令在数据处理中的应用

Python平均值命令在数据处理中的应用 Python是一门广泛应用于数据分析和数据处理的编程语言。在数据处理中&#xff0c;我们常常需要计算数据的平均值。Python中提供了多种方法来计算平均值&#xff0c;比如使用内置函数mean()或使用numpy库中的mean()函数等。本文将着重介绍P…

Vue封装API,详细解释。

1、为什么我们要封装API ps: 如果已经有了明确要封装API的需求&#xff0c;直接看第二步。 在没有封装API之前&#xff0c;我们是类似这样使用 axios 的 this.$axios.post(blogArticle/frontList,parms).then((resp) > { this.blogList resp.data, this.blogTota…