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

一、如何实现自定义注解

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实现分布式锁_第1张图片

二、基于redis实现分布式锁

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

2.1、分布式锁的基础知识

2.2、

未完待续…

你可能感兴趣的:(redis,分布式,java)