Aspect-Oriented Architectures


1.AOP基本概念


    AOP无非就是Weave(织入)什么,在哪里Weave,以及什么和哪里之间如何互相作用,这里的什么就引出了Advice(通知)这个术语,而哪里就引出了pointcut(切入点)这个概念(pointcut是由一组joinpoint连接点组成).而所谓的aspect(方面)就是把advice映射到pointcut上.也就是avice和pointcut之间如何相互作用。


Advice(通知)

    Adivce(通知)就是指定在连接点(joinpoint)做什么,比如Transactions(事务)、Security(安全)、Performance optimization(性能优化)、Error Handling(错误处理)、Logging,debugging(日志和调试)等。


Pointcut(切点)

    切点(pointcut)就是用来确定应该在哪里使用avice(通知),切点(pointcut)由一组连接点(jointpoint)组成(a set of joinpoints)。这些点包括:
*    Class names(类名)
*    Interfaces(接口)
*    Method names(方法名)
*    Attributes(属性)


Aspect(方面)

   
Aspect(方面)就是映射avice(通知)到切入点之上(Maps advice to pointcut),使用下面的方法:
 1.Apply this interceptor to these methods (应用这些拦截器到方法中)
 2.Introduce these methods to these classes(引入这些方法到class中去)
.

由此而引出了两个新的概念拦截器(interceptor)和引入(Introduction),而这两个概念就是advice(通知)的一种实现,使其在pointcut上产生作用。


Interceptor(拦截器)

   
拦截器就是在调用者和被调用者之间注入一些行为,它们是透明的。一般使用装饰器/代理模式(Decorator/Proxy pattern)。
拦截的事件包括:
    Method invocation(方法调用)
    Object construction(对象构造)
    Field access(Field访问)


Introduction(引入)

   
Introduction(引入)是一种mixin(混合)的方式,向class中添加:
*    Interfaces(接口)
*    Methods(方法)
*    Fields(值域)



2.AOP实现

关于AOP架构,AOP联盟提出的一个典型的三层架构(可以参考上篇翻译的文章Why Did We Get In?),可分为:
l  一个low-level层:提供基本的组件实现目标平台的weaving(AOP主要过程)
2.一个 high-level层
3.一个development-level层

而其中Low-level组件是最重要的,因为整个的AOE(Aspect Oriented Environnments)依赖于它的实现,组件实现的方式是至关紧要的,可能彻底的影响系统属性,比如性能,可扩展性,集成能力,安全等.

所以下面我们关注一下low-level层的各种Weave方式。


2.1.各个Weave时期的优缺点:


编译时Weave


优点:直观,支持最多种类的连接点.
缺点:需要提供所有源代码.(特别对于模块化项目,需要所有模块源代码),程序不能增量编译,编译时间变慢.


后编译时Weave

只需要获得编译完成之后的模块,就能进行Weave操作,可以解决模块化编程的要求.


载入时Weave

如果程序的主逻辑部分和Aspect作为不同的组件开发,程序的主逻辑部分和Aspect部分可以分别进行开发和编译,而Weave操作在程序别载入时发生.
在JBOSS和Spring中都提供了这样的方式进行Weave操作,框架先于应用程序启动,由框架来负责Weave操作的进行,而在AspectJ中,一个特殊的类加载器被用于这个目的。这个类加载器可以方便的嵌入到框架应用程序中,从而能够为任意的框架提供AOP支持


运行时Weave

所有Weave方式中最为灵活的,程序在运行过程中可以为单个的对象指定是否需要Weave特定的Aspect。AspectJ没有明确提供运行时Weave的能力,在AspectJ中可以通过一个简单的pattern实现运行时Weave。具体请参见Adrian的Blog:
http://www.aspectprogrammer.org/blogs/adrian/2005/03/perinstance_asp.html 。




2.2 AspectJ,Spring和JBoss比较

AOP最为特别并使其相对其它方法具有明显优点的部分就在于它能够以多样的方式将程序中用到的多个方面灵活的Weave到一起,形成一个完整的应用程序,下面是AspectJ,Spring和JBoss的比较图。
 

AspectJ

Spring

JBoss

编译时

支持



编译后

支持



载入时

支持

支持

支持

运行时



支持



注:由于high-level层和development-level层对于不同的实现存在很大的区别,所以分别在具体的AOP实现中再进行描述。




参考资源:
Aspect-Oriented Java Development (author: Bob Lee,jAdive和 DynAop框架的创建者)
AOP:选择正确的时机进行编织 http://www.ibm.com/developerworks/cn/java/j-aop-weave/