AOP观念与术语

系统 1542 0
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

示例下载。

AOP 全名为 Aspect-Oriented Programming ,有关于 AOP 的许多名词术语都过于抽象,单从字面上并不容易理解其名词意义,这边将以之前介绍代理机制的范例来逐一对照以介绍 AOP 的术语与观念:

  • <!--[if !supportLists]--> Cross-cutting concern

DynamicProxyDemo 项目的例子中,记录的动作原先被横切( Cross-cutting )入至 HelloSpeaker 本身所负责的业务流程之中,另外类似于记录这类的动作,如安全( Security )检查、事务( Transaction )等系统层面的服务( Service ),在一些应用程序之中常被见到安插至各个对象的处理流程之中,这些动作在 AOP 的术语中被称之为 Cross-cutting concerns


以图片说明可强调出 Cross-cutting concerns 的意涵,例如原来的业务流程是很单纯的:

AOP观念与术语

现在为了要加入记录( Logging )与安全( Security )检查等服务,对象的程序代码中若被硬生生的写入相关的 Logging Security 程序片段,则可使用以下图解表示出 Cross-cutting Cross-cutting concerns 的概念:

AOP观念与术语

Cross-cutting concerns 若直接撰写在负责某业务的对象之流程中,会使得维护程序的成本增高,例如若您今天要将对象中的记录功能修改或是移除该服务,则必须修改所有撰写曾记录服务的程序代码,然后重新编译,另一方面, Cross-cutting concerns 混杂于业务逻辑之中,使得业务对象本身的逻辑或程序的撰写更为复杂。

  • <!--[endif]--> Aspect

将散落于各个业务对象之中的 Cross-cutting concerns 收集起来,设计各个独立可重用的对象,这些对象称之为 Aspect ,例如在 DynamicProxyDemo 项目中将登录的动作设计为一个 LogHandler 类别, LogHandler 类别在 AOP 的术语就是 Aspect 的一个具体实例,在 AOP 中着重于 Aspect 的辨认,将之从业务流程中独立出来,在需要该服务的时候, 缝合( Weave 至应用程序之上,不需要服务的时候,也可以马上从应用程序中脱离,应用程序中的可重用组件不用作任何的修改,例如在 DynamicProxyDemo 项目中的 HelloSpeaker 所代表的角色就是应用程序中可重用的组件,在它需要记录服务时并不用修改本身的程序代码。

另一方面,对于应用程序中可重用的组件来说,以 AOP 的设计方式,它不用知道处理提供服务的对象之存在,具体的说,与服务相关的 API 不会出现在可重用的应用程序组件之中,因而可提高这些组件的重用性,您可以将这些组件应用至其它的应用程序之中,而不会因为目前加入了某些服务而与目前的应用程序框架发生耦合。

  • <!--[if !supportLists]--> Advice

Aspect 的具体实作称之为 Advice ,以记录的动作而言, Advice 中会包括真正的记录程序代码是如何实作的,像是 DynamicProxyDemo 项目中的 LogHandler 类别就是 Advice 的一个具体实例, Advice 中包括了 Cross-cutting concerns 的行为或所要提供的服务。

  • <!--[if !supportLists]--> Joinpoint

Aspect 在应用程序执行时加入业务流程的点或时机称之为 Joinpoint ,具体来说,就是 Advice 在应用程序中被呼叫执行的时机,这个时机可能是某个方法被呼叫之前或之后(或两者都有),或是某个例外发生的时候。

  • <!--[if !supportLists]--> <!--[endif]--> Pointcut

Pointcut 是一个定义,藉由这个定义您可以指定某个 Aspect 在哪些 Joinpoint 时被应用至应用程序之上。具体的说,您可以在某个定义档中撰写 Pointcut ,当中说明了哪些 Aspect 要应用至应用程序中的哪些 Joinpoint

  • <!--[if !supportLists]--> Target

一个 Advice 被应用的对象或目标对象,例如 DynamicProxyDemo 项目中的 HelloSpeaker 就是 LogHandler 这个 Advice Target

  • <!--[if !supportLists]--> <!--[endif]--> Introduction

对于一个现存的类别, Introduction 可以为其增加行为,而不用修改该类别的程序,具体的说,您可以为某个已撰写、编译完成的类别,在执行时期动态加入一些方法或行为,而不用修改或新增任何一行程序代码。

  • <!--[if !supportLists]--> <!--[endif]--> Proxy

Expert One-on-One J2EE Development WIthout EJB 一书中, Rod Johnson Juergen Hoeller 在第八章中有提到, AOP 的实作有五个主要的策略: Dynamic Proxies Dynamic Byte Code Generation Java Code Generation Use of a Custon Class Loader Language Extensions

在之前静态代理与动态代理中,已经使用实际的程序范例介绍过代理机制的实现, Spring AOP 主要是透过动态代理来完成。

  • <!--[if !supportLists]--> Weave

Advice 被应用至对象之上的过程称之为缝合( Weave ),在 AOP 中缝合的方式有几个时间点:编译时期( Compile time )、类别加载时期( Classload time )、执行时期( Runtime )。


结合 DynamicProxyDemo 的实例,将以上介绍过的 AOP 相关名词具体的使用图片来加以表示,有助于您对每一个名词的理解与认识:

AOP观念与术语


AOP观念与术语


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论