AOP 的几个概念
名称 | 解释 |
---|---|
Pointcut | 切点,决定处理如权限校验、日志记录等在何处切入业务代码中(即织入切面)。切点分为execution方式和annotation方式。前者可以用路径表达式指定哪些类织入切面,后者可以指定被哪些注解修饰的代码织入切面。 |
Advice | 增强,包括处理时机和处理内容。处理内容就是要做什么事,比如校验权限和记录日志。处理时机就是在什么时机执行处理内容,分为前置处理(即业务代码执行前)、后置处理(业务代码执行后)等。 |
Aspect | 切面,即,Pointcut 和 Advice。 |
Joint point | 接入点,是程序执行的一个点。例如,一个方法的执行或者一个异常的处理。在 Spring AOP 中,一个连接点总是代表一个方法执行 |
Weaving | 织入,就是通过动态代理,在目标对象方法中执行处理内容的过程。 |
增强类型
- 前置通知(Before Advice)
在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。ApplicationContext中在
<aop:aspect>
里面使用<aop:before>
元素进行声明。
- 后置通知(After Advice)
当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。ApplicationContext 中在
<aop:aspect>
里面使用<aop:after>
元素进行声明。
- 返回后通知(After Return Advice)
在某连接点正常完成后执行的通知,不包括抛出异常的情况。ApplicationContext 中在
<aop:aspect>
里面使用<after-returning>
元素进行声明。
- 异常通知(After Throwing Advice)
在 方 法 抛 出 异 常 退 出 时 执 行 的 通 知 。 ApplicationContext 中 在
<aop:aspect>
里 面 使 用<aop:after-throwing>
元素进行声明。
- 环绕通知(Around Advice)
包围一个连接点的通知,类似 Web 中 Servlet 规范中的 Filter 的 doFilter 方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。ApplicationContext 中在
<aop:aspect>
里面使用<aop:around>
元素进行声明。例如,ServiceAspect 中的 around 方法。
JoinPoint 和 ProceedingJoinPoint 的关系
AspectJ 使用
org.aspectj.lang.JoinPoint
接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint
表示连接点对象,该类是JoinPoint的子接口。任何一个增强方法都可以通过将第