什么是 AOP
AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,它是对 OOP(Object Oriented Programming,面向对象编程)的补充。
OOP 允许我们通过类来定义对象的属性和行为,由于对象的行为是通过类中的方法来体现的,所以要想修改一个对象的行为,就必须修改类中相应的方法。试想这么一个场景,我们需要对某些对象的某些行为进行耗时统计,OOP 的做法只能是挨个去修改它们所属的类,在相应的方法前后加入耗时统计的逻辑,如果只是针对少量几个行为的修改倒也无妨,但如果要统计的是成百上千个行为呢,挨个去修改这成百上千个方法就显得很拙劣,而且还会导致大量的代码重复,如果要统计的是第三方类库中的行为,那么 OOP 就显得更加力不从心了。
在实际开发中,除耗时统计之外,类似的还有日志记录、事务控制、权限验证等等,它们往往穿插在各个控制流中,被各个功能模块所调用,但它们却是与核心业务逻辑无关的。像这种穿插在各个功能模块中的且与核心业务无关的代码被称为横切(cross cutting)。
在传统 OOP 中,横切除了会导致大量的代码重复之外,还会使核心业务代码看起来臃肿,由于那些与核心业务无关的横切代码同核心业务代码紧密耦合在一起,甚至会出现核心业务代码被淹没在大量横切代码之中的情况,而且这些横切代码分散在系统的各个地方,非常不利于维护和管理。
AOP 提供了对横切的处理思路,它的主要思想是,将横切逻辑分离出来,封装成切面,通过某种机制将其织入到指定的各个功能模块中去,而不再是同核心业务代码交织在一起。AOP 使得我们可以暂时忽略掉系统中的横切逻辑,专注于核心业务逻辑的开发,实现横切逻辑与核心业务逻辑的解耦,允许我们对横切代码进行集中管理,消除代码重复。
AOP 的基本术语
切面(Aspect):是对横切逻辑的抽象与封装,一个切面由通知和切点两部分组成。在实际应用中,切面通常用一个类来表示,称其为切面类。
通知(Advice):是横切逻辑的具体实现。在实际应用中,通知被定义成切面类中的一个方法,该方法就是用来放横切代码的地方。通知的分类:以目标方法为参照点,根据切入方位的不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种。
切点(Pointcut):用于说明将通知织入到哪个方法上,它是由切点表达式来定义的。
目标对象(Target):是指那些即将织入切面的对象。这些对象中已经只剩下干干净净的核心业务逻辑的代码了,所有的横切逻辑的代码都等待 AOP 框架的织入。
代理对象(Proxy):是指将切面应用到目标对象之后由 AOP 框架创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上横切业务功能。