1:导入依赖
|
1 2 3 4 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> |
2:可以直接书写Aspect类

每个Pointcut的定义包括2部分,一是表达式,二是方法签名。
方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个用来引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。
常用的注解:
@Aspect、@Component、@Pointcut、@Before、@AfterReturning
常用类:
JoinPoint:获取被代理类、所访问方法、请求参数信息

RequestAttributes:获取HttpServletRequest对象信息

通常用aop实现权限校验、日志记录等功能,其实现原理是动态代理

@Aspect:声明这是一个切面类(使用时需要与@Component注解一起用,表明同时将该类交给spring管理)
@Pointcut:定义一个切点,有两种表达方式:


@Around:增强处理,用于指定【advice】的类型,是Around、Before、After、AfterReturning这四种类型中能力最强的一种
@Before:用于指定【advice】的类型,表示该【advice】在切点方法之前执行
@After:用于指定【advice】的类型,表示该【advice】在切点方法之后执行
@AfterReturning:用于指定【advice】的类型,功能与@After类似,不同点是可以捕获切点方法的返回值并进行增强处理(具体咋回事也没弄懂)
@AfterThrowing:当切点方法抛出异常时会执行该【advice】
Ps:这篇文章很好
aspect类
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Aspect @Component public class LogAspect { @Pointcut("execution(* com.example.demo.controller.Test24.*(..))") private void pointcut01(){ } @Before("pointcut01()") public void advice01(){ System.out.println("this is advice01"); } } |
controller类
|
1 2 3 4 5 6 7 8 |
@RestController @RequestMapping("/test24") public class Test24 { @GetMapping("/01") public void test(){ System.out.println("this is test24"); } } |
结果
