1. 概念介绍
AOP又名面向切面编程,是一种通过预编译方式和运行期动态代理实现程序功能的统一维护的技术;AOP是OOP的延续,其目的是对业务代码中的业务逻辑和系统逻辑进行隔离,降低两者之间的耦合度,提高程序的可重用性和开发的效率;
2. 相关术语
-
Joinpoint(连接点)
连接点是指那些被拦截到的点,在Spring中,这些点指的是方法,因为Spring只支持方法类型的连接点;
-
Pointcut(切入点)
切入点是指我们要对哪些Jointpoint进行拦截的定义;
-
Advice(通知/增强)
通知是指拦截到Joinpoint之后要做的事情,包含一个Pointcut,以及增强类实例和方法;
-
Introduction(引介)
引介是一种特殊的通知,在不修改类代码的前提下,引介可以在运行期为类动态地添加一些方法或者属性;
-
Target(目标对象)
代理的目标对象;
-
Weaving(织入)
织入是指把被增强的目标对象用来创建新的代理对象的过程,一般分为动态织入和静态织入,动态织入主要采用动态代理技术完成,静态织入主要采用编译期织入;
-
Proxy(代理)
一个类被AOP织入增强后,生成的一个新的类就被称之为代理类;
-
Aspect(切面)
切面是Pointcut和Advice的结合;
-
Advisor(通知器/顾问)
通知器,和Aspect类似,包含一个Advice和Pointcut;
3. Spring AOP实现
Spring AOP是通过动态代理技术实现的,目前市面上针对Java的动态代理技术有两种:
- JDK动态代理
- Java自带
- 目标对象必须实现接口
- 生成的代理对象也会实现该接口,所以与目标对象是平级的
- Spring的优先选择方式,因为JDK动态代理生成的类比CGLIB少
- CGLIB动态代理
- 第三方jar包提供,采用ASM技术
- 目标对象不需要实现接口
- 生成的代理对象是目标对象的子对象,所以目标对象被final修饰时无法被代理
4. 通知的类型
- 前置通知(before)
- 目标对象方法执行之前通知
- 后置通知(after-returning)
- 目标对象方法执行之后通知,若发生异常则不进行通知
- 异常通知(after-throwing)
- 目标对象方法抛出异常之后通知
- 最终通知(after)
- 目标对象方法执行之后通知,无论有没有发生异常
- 环绕通知(around)
- 目标对象方法执行之前和之后都会通知,且目标对象方法的执行由通知代码决定
5. 切入点表达式
execution([访问控制修饰符] 返回值类型 包名.类名.方法名(参数))
- execution:必须要
- 访问控制修饰符:可省略
- 返回值类型:必须要,但可以使用*通配符
- 包名:
- 多级包之间使用.分割
- 包名可以使用*代替
- 如果想省略中间的包名可以使用…
- 类名:
- 可以使用*作为通配符
- 方法名:
- 可以使用*作为通配符
- 参数:
- 可以使用*代替
- 多个参数可以使用…代替