一、AOP和 OOP
OOP:面向对象编程
AOP:面向切点编程
AOP的适用范围:如性能监测、事务控制、访问管理及事务控制等
二、AOP术语
- 连接点(JoinPoint):如类开始初始化前,类初始化后、类的某个方法执行前/执行后、方法抛出异常后。一个类或一段程序代码拥有一些具有边界性质的特定点,称为连接点。连接点由两个信息确定:
- 用方法表示的程序执行点
- 用相对位置表示的方位:如Test.foo()方法执行前的连接点,执行点为Test.foo(),方位为该方法执行前的位置
- 切点(PointCut):借助数据库查询的概念来理解。连接点相当于每条记录,而切点则相当于查询条件。一个切点可以匹配多个连接点。
- 增强(Advice):增强是织入目标类连接点上的一段程序代码。
- 目标对象(Target):增强逻辑织入的目标类
- 引介(Introduction):引介是一种特殊的增强,它为类添加一些特殊的属性和方法
- 织入(Weaving):织入是将增强添加到目标类连接点上的过程,三种织入方式
- 编译期织入:要求使用特殊的java编译器
- 类装载期织入:要求使用特殊的类装载器
- 动态代理织入:在运行期为目标类添加增强生成子类的方式
- Spring采用动态代理,而AspectJ采用编译期织入和类装载期织入
- 代理(Proxy):
- 切面(Aspect):由切点和 增强(引介)组成。既包含横切逻辑的定义,也包括连接点的定义
三、SpringAOP
两种代理机制:
- 基于JDK动态代理:只支持接口代理
- 基于CGLib动态代理:由于采用动态代理生成子类的方式,不能对目标类中的final和private方法进行代理。(比JDK动态代理的性能高出10倍左右)