自定义注解

105 阅读1分钟

1.怎么自定义注解?

基于AOP自定义注解主要分两部分,一部分是创建注解类,一部分是创建一个切面类

2.创建注解类

@Target({ElementType.METHOD}) ////指定该注解只能加在方法上
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAccess {
    String value() default "d";
}

创建注解类的关键字就是@interface,这个注解类设置了一个value变量,默认值为d;

在注解类上面还有@Target@Retention注解,下面来说说创建注解类时需要用到的几个注解:

image.png

3.创建切面类

image.png

    @Aspect
    @Component
    public class UserAccessAspect {
        //@Pointcut()里面写切点表达式:表示在被@UserAccess注解标记的方法上应用切面逻辑。
        @Pointcut("@annotation(com.example.demo.UserAccess)")
        public void userAccessPointcut() {}
        //切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。

        @After("userAccessPointcut()")//在被拦截的方法后面执行下面代码
        public void logUserAccess(JoinPoint joinPoint) {
            
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象
            UserAccess userAccess=signature.getMethod().getAnnotation(UserAccess.class);//获得方法上的注解对象
           //获取到当前被拦截的方法的参数--实体对象,eg: void update(Category category);
        Object[] args = joinPoint.getArgs();
        if(args == null || args.length == 0){//当前代码无参数
            return;
        }
        Object entity = args[0];//默认首位参数才是我们想要获取的对象,用Object接收
        // 获取注解中的value
        String value = userAccess.value();
        // 记录访问信息
         saveAccessInfo(value);
     }

        private void saveAccessInfo(String value) {
            // 将数据写入表的逻辑
        }
    }

4.使用注解

@RestController
    public class MyController {

        @UserAccess("首页接口")
        @GetMapping("/index")
        public String index() {
            return "Welcome to the index page!";
        }

        @ApiOperation("详情页接口")
        @PostMapping("/detail")
        @UserAccess("详情页接口")
        public String detail() {
            return "Welcome to the detail page!";
        }

        @ApiOperation("博客列表")
        @PostMapping("/blogList")
        @UserAccess("博客列表")
        public String blogList() {
            return "Welcome to the blogList page!";
        }
    }