网络上有张图,我觉得非常传神,贴在这里供大家观详:
2 AOP实例
=======
实践出真知,接下来我们就撸代码来实现一下AOP。完成项目已上传至:
https://github.com/ThinkMugz/aopDemo
使用 AOP,首先需要引入 AOP 的依赖。参数校验:这么写参数校验(validator)就不会被劝退了~
org.springframework.boot
spring-boot-starter-aop
2.1 第一个实例
接下来,我们先看一个极简的例子:所有的get
请求被调用前在控制台输出一句"get请求的advice触发了"。
具体实现如下:
- 创建一个AOP切面类,只要在类上加个
@Aspect
注解即可。@Aspect
注解用来描述一个切面类,定义切面类的时候需要打上这个注解。@Component
注解将该类交给 Spring 来管理。在这个类里实现advice:
package com.mu.demo.advice;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogAdvice {
// 定义一个切点:所有被GetMapping注解修饰的方法会织入advice
@Pointcut(“@annotation(org.springframework.web.bind.annotation.GetMapping)”)
private void logAdvicePointcut() {}
// Before表示logAdvice将在目标方法执行前执行
@Before(“logAdvicePointcut()”)
public void logAdvice(){
// 这里只是一个示例,你可以写任何处理逻辑
System.out.println(“get请求的advice触发了”);
}
}
- 创建一个接口类,内部创建一个get请求:
package com.mu.demo.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(value = “/aop”)
public class AopController {
@GetMapping(value = “/getTest”)
public JSONObject aopTest() {
return JSON.parseObject(“{“message”:“SUCCESS”,“code”:200}”);
}
@PostMapping(value = “/postTest”)
public JSONObject aopTest2(@RequestParam(“id”) String id) {
return JSON.parseObject(“{“message”:“SUCCESS”,“code”:200}”);
}
}
项目启动后,请求http://localhost:8085/aop/getTest
接口:
在这里插入图片描述
请求http://localhost:8085/aop/postTest
接口,控制台无输出,证明切点确实是只针对被GetMapping
修饰的方法。
2.2 第二个实例
下面我们将问题复杂化一些,该例的场景是:
-
自定义一个注解
PermissionsAnnotation
-
创建一个切面类,切点设置为拦截所有标注
PermissionsAnnotation
的方法,截取到接口的参数,进行简单的权限校验 -
将
PermissionsAnnotation
标注在测试接口类的测试接口test
上
具体的实现步骤:
- 使用
@Target、@Retention、@Documented
自定义一个注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PermissionAnnotation{
}
- 创建第一个AOP切面类,,只要在类上加个
@Aspect
注解即可。@Aspect
注解用来描述一个切面类,定义切面类的时候需要打上这个注解。@Component
注解将该类交给 Spring 来管理。在这个类里实现第一步权限校验逻辑:
package com.example.demo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Aspect
@Component<