一切福田,不離方寸,從心而覓,感無不通。

SpringBoot的AOP(@aspect注解)的简单使用

新增:

1:导入依赖


 

2:可以直接书写Aspect类

每个Pointcut的定义包括2部分,一是表达式,二是方法签名。

方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个用来引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。

常用的注解:

@Aspect、@Component、@Pointcut、@Before、@AfterReturning

常用类:

JoinPoint:获取被代理类、所访问方法、请求参数信息

RequestAttributes:获取HttpServletRequest对象信息


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

filter、interceptor、AOP的区别

  1. filter作用于servlet
  2. (通常指spring的)interceptor,拦截的对象是URL
  3. AOP作用的对象可以是任何一个方法

相关概念名词

SpringBoot中使用AOP时常用的一些注解

@Aspect:声明这是一个切面类(使用时需要与@Component注解一起用,表明同时将该类交给spring管理)

@Pointcut:定义一个切点,有两种表达方式:

  • 一个是使用 execution()
  • 另一个是使用 annotation()

@Around:增强处理,用于指定【advice】的类型,是Around、Before、After、AfterReturning这四种类型中能力最强的一种

@Before:用于指定【advice】的类型,表示该【advice】在切点方法之前执行

@After:用于指定【advice】的类型,表示该【advice】在切点方法之后执行

@AfterReturning:用于指定【advice】的类型,功能与@After类似,不同点是可以捕获切点方法的返回值并进行增强处理(具体咋回事也没弄懂)

@AfterThrowing:当切点方法抛出异常时会执行该【advice】

Ps:这篇文章很好


例1:

aspect类


 

controller类


 

结果

from:https://zhuanlan.zhihu.com/p/351468451