什么是AOP
AOP ( Aspect-Oriented Programming, 面向方面编程
) , 可以说是OOP ( Object - Oriented Programming , 面向对象编程 ) 的补充和完善.
OOP引入封装、继承和多态性等概念来建立一种对象层次结构, 用以模拟公共行为的一个集合. 当我们需要为分散的对象引入公共行为的时候, OOP则显得无能为力. 也就是说, OOP允许你定义从上到下的关系, 但并不适合定义从左到右的关系. 例如日志功能. 日志代码往往水平地散布在所有对象层次中, 而与它所散布到的对象的核心功能毫无关系. 对于其他类型的代码, 如安全性、异常处理和透明的持续性也是如此. 这种散布在各处的无关的代码被称为横切 ( cross - cutting ) 代码, 在OOP设计中, 它导致了大量代码的重复, 而不利于各个模块的重用.
而AOP技术则恰恰相反, 它利用一种称为 “横切” 的技术, 剖解开封装的对象内部, 并将那些影响了多个类的公共行为封装到一个可重用模块, 并将其名为 “Aspect”, 即方面. 所谓 ”方面” , 简单地说, 就是将那些与业务无关, 却为业务模块所共同调用的逻辑或责任封装起来, 便于减少系统的重复代码, 降低模块间的耦合度, 并有利于未来的可操作性和可维护性. AOP代表的是一个横向的关系, 如果说 “对象” 是一个空心的圆柱体, 其中封装的是对象的属性和行为; 那么面向方面变成的方法, 就仿佛一把利刃, 将这些空心圆柱体剖开, 以获得其内部的消息. 而剖开的切面, 也就是所谓的 ”方面” 了. 然后它又以巧夺天工的妙手将这些剖开的切面复原, 不留痕迹.
使用 “横切” 技术, AOP把软件系统分为两个部分: 核心关注点和横切关注点. 业务处理的主要流程是核心关注点, 与之关系不大的部分是横切关注点. 横切关注点的一个特点是, 他们经常发生在核心关注点的多处, 而各处都基本相似. 比如权限认证、日志、事务处理. AOP的作用在于分离系统中的各种关注点, 将核心关注点和横切关注点分离出来. 正如Avanade公司的高级方案构架师Adam Magee所说, AOP的核心思想就是 “将应用程序中的商业逻辑同对其提供支持的通用服务进行分离."
实现AOP的技术, 主要分为两大类: 一是采用动态代理技术, 利用截取消息的方式, 对该消息进行装饰, 以取代原有对象行为的执行: 二是采用静态织入的方式, 引入特定的语法创建 “方面” , 从而使得编译器可以在编译期间织入有关 “方面” 的代码. 然而殊途同归, 实现AOP的技术特性却是相同的, 分别为:
- join point ( 连接点 ) : 是程序执行中的一个精确执行点, 例如类中的一个方法. 它是一个抽象的概念, 在实现AOP时, 并不需要去定义一个join point.
- point cut ( 切入点 ) : 本质上是一个捕获连接点的结构. 在AOP中, 可以定义一个point cut, 来捕获相关方法的调用.
- advice ( 通知 ) : 是point cut的执行代码, 是执行 “方面” 的具体逻辑.
- aspect ( 方面 ) : point cut和advice结合起来就是aspect, 它类似于OOP中定义的一个类, 但它代表的更多的是对象间横向的关系.
- introduce ( 引入 ) : 为对象引入附加的方法或属性, 从而达到修改对象结构的目的. 有的AOP工具又将其称为mixin.
上述的技术特性组成了基本的AOP技术, 大多数AOP工具均实现了这些技术. 它们也可以是研究AOP技术的基本术语.
横切技术
“横切” 是AOP的专有名词. 它是一种蕴含强大力量的相对简单的设计和编程技术, 尤其是用于建立松散耦合的、可扩展的企业系统时. 横切技术可以使得AOP在一个给定的编程模型中穿越既定的职责部分 ( 比如日志记录和性能优化 ) 的操作.
如果不适用横切技术, 软件开发是怎样的情形呢? 在传统的程序中, 由于横切行为的实现是分散的, 开发人员很难对这些行为进行逻辑上的实现或更改. 例如, 用于日志记录的代码和主要用于其他职责的代码缠绕在一起. 根据所解决的问题的复杂程度和作用域不同, 所引起的混乱可大可小. 更改一个应用程序的日志记录策略可能涉及数百次编辑—— 即使可行, 这也是个令人头疼的任务.
在AOP中, 我们将这些具有公共逻辑的, 与其他模