这是我自己配置动态多数据源的时候测试配置的切面方法,这只是测试用的,里面的很多参数,注解名称自己需要自定义
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";
}
- 创建一个切面的类,实现切面执行的方法,这里只写了前置通知,环绕通知要使用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);
}
}
}
- 使用,就是在你要增加切面的方法,类上面添加上面自己写的注解
@GetMapping("/info")
@CDS
public void info( String userId){
System.out.println("测试方法~~~~");
}