在一个地方定义通用功能,但是我们可以通过声明的方法定义这个功能在何处应用,无需修改受影响的类,这些类称之为切面
对于AOP的使用,我们需要抓住以下几点:
- 通用功能:什么样的功能叫通用功能呢,比如日志、事务之类。
- 何处使用:在什么地方会使用上日志、事务。
- 无需修改:这算是aop 的一个特点吧,举个例子 ,如果你要在每个方法上加入日志,最简单最傻的方法是一个个加log,那么会带来一个问题,修改起来特别麻烦。这个时候就需要用到aop了。
使用前,我们还是先弄明白AOP的基本概念。
1. 通知 (Advice):
某个连接点所采用的处理逻辑,也就是向连接点注入的代码, AOP在特定的切入点上执行的增强处理。
Springboot 有5种类型的通知:
-
-
@Before
: 标识一个前置增强方法,相当于BeforeAdvice的功能.
-
-
-
@After
:标识一个final增强,不管是抛出异常或者正常退出都会执行.
-
-
-
@AfterReturning
: 标识一个 后置增强,似于AfterReturningAdvice, 方法正常退出时执行.
-
-
-
@AfterThrowing
: 标识一个异常抛出增强,相当于ThrowsAdvice.
-
-
-
@Around
: 标识一个环绕增强,相当于MethodInterceptor, 通知包裹着被通知的方法。中间可以使用point.proceed()
继续执行方法。.
-
2. 连接点(JointPoint):
程序运行中的某个阶段点,比如方法的调用、异常的抛出等。
JointPoint提供对连接点可用状态和关于连接点的静态信息的反射访问。该信息可以通过特殊形式thisJoinPoint从通知体中获得。这个反射信息的主要用途是跟踪和记录应用程序。
常用的方法:
* Object[] getArgs:返回目标方法的参数
* Signature getSignature:返回目标方法的签名
* Object getTarget:返回被织入增强处理的目标对象
* Object getThis:返回AOP框架为目标对象生成的代理对象
当使用@Around处理时,需要将第一个参数定义为ProceedingJoinPoint类型,该类是JoinPoint的子类。
3. 切入点(Pointcut):
JoinPoint的集合,是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发,在程序中主要体现为书写切入点表达式。
// 切入点
@Pointcut("execution(* checkParams_*(..))")
public void servicePointcut() {
}
4. 增强(Advisor):
是PointCut和Advice的综合体,完整描述了一个advice将会在pointcut所定义的位置被触发。
// 通知
@Before(value = "servicePointcut()")
// 连接点
public void before(JoinPoint joinPoint) throws Exception {
// 增强功能
}
5. 切面(@Aspect):
通常是一个类的注解,里面可以定义切入点和通知、增强能力……
@Aspect
@Component
public class ParamsValidator {
}
通常,@Aspect与@Component搭配使用
6. AOP Proxy:
AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。
//OK所以一个Spring增强(advisor)=切面(advice)+切入点(PointCut)