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