SpringBoot 自定义 注解 + AOP配置 获取请求参数方法名等

这是我自己配置动态多数据源的时候测试配置的切面方法,这只是测试用的,里面的很多参数,注解名称自己需要自定义

1. maven依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2. 创建一个注解类

@Target 表示注解可以使用在哪里 (类上,方法上,参数上,字段上等)
@Retention 注解保留多久, 一般使用runtime 可以使用反射
source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略
class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期
runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在

import java.lang.annotation.*;

/**
 * 自定义注解
 */
@Target({ElementType.TYPE, ElementType.METHOD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CDS {
// 注解的参数 value 可以向注解中设置参数 默认值设置的 primary
    String value() default "primary";
}
  1. 创建一个切面的类,实现切面执行的方法,这里只写了前置通知,环绕通知要使用ProceedingJoinPoint
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

@Component
@Aspect
public class CAspect {

// 这里写明切入点的位置是含有这个自定义注解的地方
    @Before("@annotation(cn.yctech.CDS))")
    public void befor(JoinPoint joinPoint){
        //1.获取切入点所在目标对象
        Object targetObj =joinPoint.getTarget();
        System.out.println(targetObj.getClass().getName());
        // 2.获取切入点方法的名字
        String methodName = joinPoint.getSignature().getName();
        System.out.println("切入方法名字:"+methodName);
        // 3. 获取方法上的注解
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();

        if (method != null)
        {
            CDS2 apiLog=  method.getAnnotation(CDS2.class);
            System.out.println("切入方法注解的title:"+apiLog.value());
        }

        //4. 获取方法的参数 一一对应
        Object[] args = joinPoint.getArgs();
//        获取参数名称 一一对应
        String[] parameterNames = methodSignature.getParameterNames();
//        获取参数类型 一一对应
        Class[] parameterTypes = methodSignature.getParameterTypes();
        for(Object o :args){
            System.out.println("切入方法的参数:"+o);
        }

    }

}
  1. 使用,就是在你要增加切面的方法,类上面添加上面自己写的注解
    @GetMapping("/info")
    @CDS
    public void info( String userId){
		System.out.println("测试方法~~~~");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿彤木11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值