目录
一、AOP 常用术语
- 连接点(Join point)
- 切点(Pointcut)
- 通知(Advice)
- 切面(Aspect)
- 织入(Weaving)
- 引入(Introduction)
二、术语理解
1.连接点(Jion point)
在一个工程中通常会有无数的方法,每个方法中都含有多个可以进行织入的点,可能是在调用方法、返回方法、抛出异常甚至修改字段时,所有这些点我们称之为连接点。
2.切点(Pointcut)
连接点有很多个,但是某个切面可能只要织入到这些连接点中的某几个。切面通过定义切点的方式来定义这个切面要织入到哪几个连接点当中,具体方法是指定类、方法名称或使用正则表达式,甚至定义动态的切点来根据运行时的决策决定是否应用通知。
3.通知(Advice)
通知包含了一个切面所要做的事,以及作用于方法的哪个位置。它于切点的区别在于:切点只能精确到某个方法,接下去由通知决定作用于方法调用时、返回时还是抛出异常时等等,具体有5种类型的通知:
- 前置通知(Before):在方法调用前调用通知的内容;
- 后置通知(After):在方法完成后调用通知的内容,且不关心方法的执行结果;
- 返回通知(After-returning):在方法成功执行后调用通知的内容;
- 异常通知(After-throwing):在方法抛出异常后调用通知的内容;
- 环绕通知(Around):包裹了目标方法,在调用前和调用后都执行方法;
4.切面(Aspect)
切面是通知和切点的结合。即为:在哪些方法(切点)的哪些地方做哪些事情(通知)。
5.织入(Weaving)
织入指的是把切面应用到目标对象并创建新的代理对象的过程。在目标的生命周期有多个时间点可以进行织入:
- 编译期:切面在目标编译时被织入。这种方式需要特殊的编译器。AspectJ 的织入编译器就是以这种方式织入切面的。
- 类加载期:切面在目标类加载到 JVM 时被织入,这种方式需要特殊的类加载器(ClassLoaer),它可以在目标类被引入应用时增强该类的字节码。AspectJ 5 的加载时织入就支持这种方式。
- 运行期:切面在应用运行的某个时刻被织入。一般情况下,AOP 容器会为目标对象动态创建一个代理对象。SpringAOP 就是以这种方式进行织入。
6.引入(Introduction)
引入可以让我们往现有的类添加新的属性和方法,做到在无需修改现有类的情况下,让它具有新的行为和状态。
三、重点说明
1.AOP 框架有很多,SpringAOP 和 AspectJ 只是其中的两种,只是这两个项目间有大量的协作而已。
2.SpringAOP 通知是 Java 编写的,方便开发者通过 Java 集成开发环境(IDE)来开发切面。
3.SpringAOP 是在运行时进行织入的。直到 bean 从应用上下文中取出来时,Spring 才会为 Bean 创建一个代理,包裹目标 Bean,该代理会拦截调用者发起的调用,在执行目标方法前,先执行切面的逻辑。
4.Spring 只支持方法级别的连接点。因为 Spring 是基于动态代理的,所以只能支持到方法级别的连接点,但是这基本够用了。如果想使用更细颗粒度的连接点,可以试试其他的 AOP 框架,例如 AspectJ 和 JBoss,他们提供字段和构造器级别的连接点。
(原创不易,转载请注明出处!!)