AOP(Aspect-Oriented Programming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。
OOP的编程思想是将一切事物对象化,任何事物都具有自身的一些属性和特征,将这些属性与特此抽象出来进行描述,即构成面向对象编程。这是一种对象层次间的抽象。然而,当要为这些分散的对象引入公共行为的时候(例如进行日志记录),对于OOP,只能在每个具体对象内部进行代码插入,这样做的一个缺点就是大量重复代码存在于不同的对象之间,代码混乱且不利于模块间的重用。这种与业务逻辑无关的散乱在各处的代码,被称为 横切(cross-cutting)代码。
AOP的思想就是采用一种称为“横切”的技术,将对象内部的与业务逻辑无关的代码切取出来,封装成为同一个模块,专业术语称该模块称为Aspect,即方面(切面)。所谓“切面”,简单地说,就是将那些与业务无关,却为业务模块所共同,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为; 那么面向切面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。
AOP的核心思想就是将具体业务逻辑(核心关注点)与提供支持的通用服务(横切关注点)隔离开来。
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。然而殊途同归,实现AOP的技术特性却是相同的,分别为:
- join point(连接点):是程序执行中的一个精确执行点,例如类中的一个方法,类中设置变量或获取变量的地方都可以视作一个JPoint.
- point cut(切入点):提供一种方法使得开发者能够选择自己感兴趣的JoinPoints。
- advice(通知):是point cut的执行代码,是执行“方面”的具体逻辑。
- aspect(方面):point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的关系。
- introduce(引入):为对象引入附加的方法或属性,从而达到修改对象结构的目的。有的AOP工具又将其称为mixin。