关注,AOP
AOP的核心概念是关注点,我开始关注AOP。
一、Why AOP?
a) AOP一般观点
一般在开发系统时,我们可以大致的把系统的需求分类为核心模块级需求和系统级需求。很多系统级需求一般来说是相互独立的,但它们一般都会横切许多核心级模块。以一个电信领域的短信网关系统为例,系统的核心级需求是短信的收发,话单处理等,而其系统级的需求包括日志,校验以及性能问题等。像日志这种系统级的需求就横切短信收发、话单处理等几乎所有网关核心级需求。虽然横切需求会跨越多个模块,但目前的技术倾向于使用一维的方法学来处理这种横切需求,把对应需求的实现强行限制在一维的空间里。这个一维空间就是核心模块级实现,其他横切需求的实现被嵌入在这个占统治地位的空间,换句话说,需求空间是一个n维空间,而实现空间是一维空间,这种不匹配导致了糟糕的需求到实现的映射。
b) AOP开发过程
AOP(面向方面的编程方式)将上面所述的横切需求和核心需求都通通称为关注点(concerns)。AOP认为每一个复杂的系统都可以看作是由多个关注点来组合实现的。在这样的情况下,利用AOP开发系统的过程就变成了“识别关注点”(方面分解)—〉“实现关注点”—〉“组装关注点”(方面的重组,又叫织入)。
二、AOP和OOP
a) AOP作为OOP的补充,它提供了另外一种考量程序结构(program structure)的方式。OO将系统分解成一系列具有继承体系关系的objects;而AOP则将系统分解为aspects or concerns。而且AOP可更好地将一些横切concerns模块化,便于复用和维护。
b) AOP,从其本质上讲,使你可以用一种松散耦合的方式来实现独立的关注点,然后,组合这些松散耦合的、模块化实现的横切关注点来搭建系统。与之对照,用OOP建立的系统则是用松散耦合的模块化实现的一般关注点来实现的。在AOP中,这些良好模块化的横切关注点的实现单元叫方面(aspect),而在OOP中,这些一般关注点的实现单元叫做类(class)。
c) 在AOP里,每个关注点的实现并不知道是否有其它关注点关注它,这是AOP和OOP的主要区别,在AOP里,组合的流向是从横切关注点到核心关注点,而OOP则恰恰相反。
d) 感觉AOP是在OOP后对那些objects重新分类的过程,将被广泛关注的objects(即横切于多个objects中的objects)提取出来,加工后再重新和原来核心objects组合起来。
三、AOP基本概念
下面是一些AOP基本概念的解释,摘录自AspectJ的FAQ和Spring AOP的Online book:
a) Aspect(方面): A modularization of a concern for which the implementation might otherwise cut across multiple objects。
b) Joinpoint(连接点): Join points are well-defined points in the execution of a program. Not every execution point is a join point: only those points that can be used in a disciplined and principled manner are。
c) Advice(通知): Advice is code that executes at each join point picked out by a pointcut There are three kinds of advice: before advice, around advice and after advice. As their names suggest, before advice runs before the join point executes; around advice executes before and after the join point; and after advice executes after the join point. The power of advice comes from the advice being able to access values in the execution context of a pointcut.
d) Pointcut(横切点): A set of joinpoints specifying when an advice should fire. An AOP framework must allow developers to specify pointcuts: for example, using regular expressions. A pointcut picks out join points . These join points are described by the pointcut declaration. Pointcuts can be defined in classes or in aspects, and can be named or be anonymous.
e) Weaving(织入):将Aspects组装成为最终系统。这个织入过程可以在编译期完成,也可以在运行时完成。
我想我们可以如下图理解AOP:
|———————————–|
| pointcut |
| |————————| |
| | advice1 | |
| | |————–| | |
| | | jointpoint1| | |
| | |————–| | |
| | | |
| |————————| |
| |
| |————————| |
| | advice2 | |
| | |————–| | |
| | | jointpoint2| | |
| | |————–| | |
| | | |
| |————————| |
| ……. |
|————————————|
评论