1.怎么自定义注解?
基于AOP自定义注解主要分两部分,一部分是创建注解类,一部分是创建一个切面类。
2.创建注解类
@Target({ElementType.METHOD}) ////指定该注解只能加在方法上
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAccess {
String value() default "d";
}
创建注解类的关键字就是@interface,这个注解类设置了一个value变量,默认值为d;
在注解类上面还有@Target和@Retention注解,下面来说说创建注解类时需要用到的几个注解:
3.创建切面类
@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!";
}
}