posts - 431,  comments - 344,  trackbacks - 0

英文原文出自《Spring In Action》

像绝大多数的技术一样,AOP也有自己的术语。不幸的是,很多用于描述AOP特征的术语并不直观,但是,它们已经成为了AOP语言的一部分,如果你想理解AOP,你必须学会这门AOP语言。通俗地说,你想在圈子里面混,你就得学会说行话。

Aspect

Aspect是你正在实现的一个cross-cutting的功能,它是你应用中正在模块化的一个方面(aspect)。比较通用的一个例子是日志。记录日志是一项贯穿整个应用的服务。由于应用基本以功能(基于业务逻辑)为界限进行划分模块,故通过继承的方法来重用日志模块似乎不合理。但是,你可以创建一个日志aspect来实现你的想法。

Joinpoint

Joinpoint是在应用运行中那些aspect可以插进来的点。这个点可能是一个被调用的方法,一个被抛出的异常,甚至可以是一个被改变的字段。在这些点处添加你的aspect的代码,就可以为你的应用增加一些新的行为。

Advice

Advice是对aspect的一个具体实现。它向系统建议(advice)增加一个新的行为。在我们的日志例子中,日志advice包含了记录日志的代码并实现真正的日志记录,比如将日志写入文件。Advice被添加到joinpoint点上。

Pointcut

Pointcut定义了advice应该被插入到什么样的joinpoint点上。Advice可以被应用到任意AOP框架支持的joinpoint上。当然,你不会希望将所有的aspect应用到可以被应用的joinpoint上面。Pointcut让你可以指定advice应用的位置。通常,你用具体的类名或方法名,或者一些符合表达式的类或方法名来指定pointcut。 一些AOP框架允许你创建动态的pointcuts,这些pointcuts可以在运行的时候动态决定是否需要应用advice,比如方法的参数值。

Introduction

Introduction可以让你添加方法和属性到已经存在的类中。例如,你可以创建一个Auditable的advice类用来跟踪某对象最后改变的时期。这个可以简单地通过一个属性记录状态,并添加一个setLastModified(Date)方法来实现。然后,它可以被引入(introduce)到已经存在的类。这样,已有的类不需要做任何改变就有了个新的功能。

Target

Target是正在被advice的类,这可以是你自己写的一个类或者是你想增加新的功能的第三方提供的类。没有AOP,这个类必须被包括自身主要的逻辑并且额外加上那些cross-cutting关心的逻辑。有了AOP,target类只需要关注自身所需要关心的,而把那些应用于自身的advices抛到脑后。

Proxy

Proxy是被应用了advice的target实例。从客户实例的角度来看,无论是target实例(AOP之前)还是proxy实例(AOP以后),都是一样的,当然,它们本来就应该是一样的。也就是说,你的既有应用不需要做改变来支持proxy类。

Weaving

Weaving是指把aspects应用到目标实例上去创建一个新的proxied实例的过程。Aspects在目标对象的joinpoint被组合(weave)进去。Weaving可以发生在目标类生存的如下时间:

  • 编译期 -- Aspects在目标类编译期被weave。这个需要特殊的编译器。
  • 载入期 -- Aspects在目标类载入期被weave。这个需要特殊的类装载器。
  • 运行期 -- Aspects在应用运行时的某个时期被weave。一般来说,AOP容器在weave in aspects的时候会动态创建proxy类来代理target类。

图例:

PS:



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=697258

posted on 2006-12-27 10:51 周锐 阅读(422) 评论(0)  编辑  收藏 所属分类: Spring

只有注册用户登录后才能发表评论。


网站导航: