【AOP的使用场景】
性能测试
访问控制
事务管理
日志记录
【AOP相关术语】
[ 连接点 Joinpoint ]
程序执行的某个特定位置。(假如Car类有drive()方法,那么在drive()方法之前,drive()方法之后,或者方法抛出异常之后,这些即为连接点)Spring仅仅支持方法的连接点,即仅能在方法调用前、调用后、方法调用前后、方法抛出异常时这些连接点执行织入增强。
连接点由两个信息确定:
1.方法表示的程序的执行点。如Car类的drive()方法。
2.用相对点表示的方位。如Car类的drive()方法之前、之后、前后或抛出异常。
[ 切点 Pointcut ]
一个类可能有多个连接点(如Car类的有多个方法),切点的存在是为了“定位”连接点。假如多个连接点是数据库中的多条数据,切点相当于查询条件。注意:一个切点可以匹配多个连接点(正如SQL语句的Select可以查询多条数据)。
在Spring中连接点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件。由于连接点是方法的执行前、后的包括方位信息的具体程序执行点,注意切点只定位到某个方法上(还没有包含方位,方位由增强Advice提供)。
(切点:定位某个方法 连接点:定位方法前、方法后......)
[ 增强 Advice ]
增强是织入到目标类的连接点上的一段程序代码。
在Spring中,增强除了包含一段程序代码外,还包含了连接点的方位信息。
正由于增强的者两部分组成,Spring的增强接口都是带方位名称的:BeforeAdvice、AfterReturning、ThrowsAdvice等。
注意:只有切点和增强一块才能确定具体的连接点,并执行增强的代码。
[ 目标对象 target ]
增强织入的目标类。
[ 引介 Introduction ]
引介是一种特殊的增强,它为类添加一些属性和方法。即使一个业务类原本没有实现某个接口,通过AOP的引介功能,可以动态地为该业务类添加接口的实现逻辑,让业务类称为这个接口的实现类。
[ 织入Weaving ]
将增强添加到目标类的具体连接点的过程。
AOP的织入有三种方式:
1.编译期织入,要求使用特殊的java编译器。
2.类装载织入,要求使用特殊的类装载器。
3.动态代理织入,在运行期间为目标类添加增强,生成子类的过程。
Spring采用的是3.动态代理织入的方式,而AspectJ采用1,2方式的织入。
[ 代理 Proxy ]
一个类被AOP织入增强后,就产生了一个结果类,它是融合了原来类和增强逻辑的代理类。
按照不同代理方式,代理类即可能是和原来类具有相同的接口,也可能是原来类的子类。
[ 切面 Aspect ]
切面由" 切点+增强(或引介) "组成。它既包含了横切逻辑的定义,也包括了连接点的定义。
SpringAOP就负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。