AOP概述

 

面向方面程序开发AOP综述

一、为什么要引入AOP

1 几年前,常用的解决方法就是把问题分成小而又小的功能模块,再把这些模块变成数十行或更多行的代码来实现。这种方法确实可行,然而受到了这样的困扰:系统状态由很多全局变量控制,而应用程序中任意一行代码都能够修改这些全局变量。随后出现了面向对象设计方法,它把系统状态变成一些单独的对象,在这些对象中可以私有化系统状态,并且通过访问方法和逻辑来控制这些状态。

然而在面向对象设计的过程中又遇到了这样的困难:把问题全部表示成完全模块化的、完全封装好的模型,亦即把问题分解成了一些对象对程序的设计会有所帮助,但是有些功能必须跨对象(模块)来运用,然而在实际应用中我们也看到OOP并不能够完全解决跨越多个模块的行为。例如,在编程的过程经常会这样的问题:需要对系统中的某些方法进行日志记录,这种需要记录的方法散布在30多个类中。面对这种需求,最直接的办法就是:创建一个基类(或接口),将日志的功能放在其中,并让所有需要日志功能的类继承这个基类(或接口)。如果这个需求是后期提出的,需要修改的地方就会分散在30多个文件中这样大的修改量,无疑会增加出错的几率,并且加大系统维护的难度,这样就会破坏封装性和造成代码的混乱。

2另外,许多软件系统不完全都能按系统的功能来划分构件,要完成的业务功能只是核心级关注点(concerns),此外,还有不少系统级关注点,它们是完成核心级关注点所必须的配套设施,如日志记录、跟踪、出错处理和安全检测等。这些系统级关注点与核心功能级关注点有交叉(cutcross)。当系统级关注点能相对分割地在基本功能中考虑和分析时,使用当前的面向对象语言导致在许多构件中要重复包含(扩散)这些代码,源程序就要变成一些为不同目的而编制的指令的缠结(tangling)混乱物。它增加了功能构件之间的依赖性,分散了构件原来假定要做的事情,提供了许多程序设计出错的机会,使得一些功能构件难以复用,源代码难以开发、理解和发展。

3在实践中人们认识到,OOP对软件职责的划分是“垂直的”,每一棵继承树负责软件系统中一个特定部分的功能。但是,在实际问题中,常常有一些“水平”的功能需求,这些“水平”的功能需求有一个共同的特点:它们的操作对象横跨了多棵继承树,并且操作本身对于操作对象是透明的。因此,OOP经常表现出一些不能自然地适合单个程序模块或者几个紧密相关的程序模块的行为,如日志记录、事务完整性、授权、安全及性能优化等问题。我们将这种行为称为横切关注点(Crosscuttin Concerns),因为它跨越了给定编程模型中的典型职责界限,这是缺乏模块性所带来的问题。因为横切行为的实现是分散的,开发人员发现这种行为难以进行逻辑思维、实现和更改。在标准OO技术的环境下,人们想出了一些解决方案,如单根继承体系和某些结构型设计模式等,但其结果都不能令人满意。

为此,施乐公司帕洛阿尔托研究中心(Xerox Palo Alto Research Center)Gregor Kiczales等在实践的基础上于1997年提出了一个全新的编程技术――面向方面程序设计(Aspect Oriented ProgrammingAOP),并开发了第一个AOP开发环境――AspectJ

AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化。通过划分AspectJ代码,横切关注点变得容易处理.开发者可以在编译时更改,插入或除去系统的Aspect,甚至重用系统的Aspect。用AOP实现的软件模块化程度更高,软件可重用性更好;它弥补了OOP的不足、尤为突出的是,用AOP实现的软件可扩展,易更新。

二、AOP基础及相关的概念

1、连接点(Joint Point)

连接点是AspectJ中的一个重要概念,它是程序执行过程中明确定义的点。连接点可能定义在方法调用、条件检测、循环的开始或是赋值动作处。连接点有一个与之相关联的上下文.比如,一个方法调用连接点的上下文可能会包含一个目标对象及调用参数等。

2 切入点(Pointcut)

切入点是一种专门用来识别并选择AspectJ程序中的连接点结构。如果通知(Advice),导言和元数据是AOP的特征,那么pointcuts就是粘合剂。Pointcuts告诉AOP框架,哪些通知(Advice)绑定到哪些类,什么元数据将应用于哪些类或者哪一个导言将被传入哪些类。Pointcuts定义各种AOP特征将怎样应用于你应用中的类。

例:Pointcut updateTable():call(public String DBTrans.updateTables(String));

3 通知(Advice)

advice是到达应用程序代码中的连接点处时要执行的代码。一个通知是一个逻辑,这个逻辑由特定的事件触发;它是行为,这个行为能够被插入在调用者和被调用者之间,在一个方法调用者和实际的方法之间,通知是AOP真正的关键。

在大多数的AOP规范中,当接入点匹配时,advice代码可以在3 个不同的地方执行:连接点之前(before)、连接点之后(after)、连接点附近(around)。

例:before () : updateTable(){ System.out.println(“passed parameter-“+s);}

4、类型间声明(inter-type declaration

一种向以前建立的类中添加属性的强大机制。类间声明被描述为静态横切,它们影响到了程序的静态类型层次结构,赋予aspect从外部改变类的能力。

5、方面(aspect

从抽象意义上讲,是对软件系统构件的性能和语法产生一定影响的一些属性;从设计上讲是横切系统的一些软件系统级关注点;从实现上讲,是一种程序设计单元,类似于class,它支持将横切系统的关注点封装在单独的模块单位中,是AOP将横切关注点局部化和模块化的实现机制。

jion-pointpointcutadvice及类间声明进行封装。它和类相似,方面也可以包含方法和属性,从其它类或方面扩展以及实现接口等。与类不同的是,不能用new来建立一个方面实例。

AspectJ允许在类中声明切入点,但在类中只能声明static的切入点。而且AspectJ不允许类里包含通知,只有方面可以包含通知。

6、关注点(concern)

关注点就是一个特定的目标、概念或者兴趣域。从过程的角度,典型的开发关注点包括:需求分析、设计、编码、测试和维护。从技术的角度,一个关注点(Concern)就是一个特定的目的,一块我们感兴趣的区域,一个典型的软件系统会包含若干个核心的关注点和系统级的关注点。核心级关注点是系统要完成的业务功能;系统级关注点是完成核心级关注点所必须的配套设施,这些配套设施通常就认为是整个系统的系统特性,或者是业务功能的功能约束。例如,一个信用卡处理系统的核心关注点是借贷/存入处理,而系统级的关注点则是日志、事务完整性、授权、安全性及性能等问题。

7、横切关注点(crosscutting concerns)

很多系统级关注点一般来说是相互独立的,但它们一般都会横切许多核心模块。一个典型的企业应用会包含许多横切关注点,如验证、日志、资源池、系统管理、性能及存储管理等,每一个关注点都牵涉到几个子系统,如存储管理关注点会影响到所有的有状态业务对象。Tzilla Elrad等在所描述的图形编辑器的UML图中,两个关注点:跟踪每个图形元素位置的数据关注点(data concern)和图形元素移动时更新显示的特征关注点(feature concern)。在OO设计中,很好地分解了数据关注点,然而特征关注点却横切了数据关注点;软件可以围绕特征关注点来设计,但是数据关注点又将横切特征关注点。总之,不论怎么设计,在这个图形编辑器中,这两个关注点总是会相互横切(如图1所示)

8、引入(Introduce)

有些地方把它翻译成为引言或导言,引入是一个增加方法或者域到一个存在的类中的途径。它们甚至允许你改变当前存在的类的显式接口,并且引入一个混合的类,这个类实现了新的接口.导言允许你将多继承引入到一般的Java类。引入的一个主要的用例是当有一个方面,并想让这个方面有一个运行时间接口,跨越不同的对象层次时,仍然要让应用开发者能够调用特定方面的APIs。引入能够是一个方法,它将一个新的API绑定到一个存在的对象模型。引入就是为对象引入附加的方法或属性,从而达到修改对象结构的目的。有的AOP工具又将其称为mixin

9 元数据(metadata)

元数据是能够在静态或者运行时间绑定到一个类的附加信息,更强大的一方面是,能够动态绑定元数据到一个给定的对象实例。当真正编写应用于任何对象的一般方面,而逻辑需要知道制定类的信息时,元数据是非常强大的。一个好的元数据类比就是EJB规范。

10、面向方面编译器(Aspect weaver)

编译由AOP语言开发的程序与通常的程序不太一样,AOP首先通过方面编织器将代码和方面编织在一起然后再将程序编译成可执行文件,如图2将显示了传统的程序编译过程和AOP的编译过程的不同。

AOP中将编织的过程也称之为织入,所谓的织入就是将关注点和应用程序集成在一起的过程。织入的类型有:编译期、链接期、载入期和运行期。

3 与传统方法相比,AOP允许程序编译成可执行文件前通过方面编织器将代码及方面编织在一起。左图为传统编译方法示意图,右图为AOP程序的编译过程示意图。

 

三、面向方面的JAVA编程AspectJ的一些应用

1、横切关注点

横切AOP的专有名词。它是一种蕴含强大力量的相对简单的设计和编程技术,尤其是用于建立松散耦合的、可扩展的企业系统时。横切技术可以使得AOP在一个给定的编程模型中穿越既定的职责部分(比如日志记录和性能优化)的操作。很多系统级关注点一般来说是相互独立的,但它们一般都会横切许多核心模块。一个典型的企业应用会包含许多横切关注点,如验证、日志、资源池、系统管理、性能及存储管理等,每一个关注点都牵涉到几个子系统。

如果不使用横切技术,软件开发是怎样的情形呢?在传统的程序中,由于横切行为的实现是分散的,开发人员很难对这些行为进行逻辑上的实现或更改。例如,用于日志记录的代码和主要用于其它职责的代码缠绕在一起。根据所解决的问题的复杂程度和作用域的不同,所引起的混乱可大可小。更改一个应用程序的日志记录策略可能涉及数百次编辑——即使可行,这也是个令人头疼的任务。

AOP中,我们将这些具有公共逻辑的,与其他模块的核心逻辑纠缠在一起的行为称为横切关注点(Crosscutting Concern,因为它跨越了给定编程模型中的典型职责界限。

2、关注点分离

AOP语言的主要目标是分离关注点。一个关注点(concern)就是一个特定的目的,一块我们感兴趣的区域,一段我们需要的逻辑行为。从技术的角度来说,一个典型的软件系统包含一些核心的关注点和系统级的关注点。举个例子来说,一个信用卡处理系统的核心关注点是借贷/存入处理,而系统级的关注点则是日志、事务完整性、授权、安全及性能问题等,许多关注点——即横切关注点(crosscutting concerns——会在多个模块中出现。如果使用现有的编程方法,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和演进。AOP能够比上述方法更好地分离系统关注点,从而提供模块化的横切关注点。

例如一个复杂的系统,它由许多关注点组合实现,如业务逻辑、性能,数据存储、日志和调度信息、授权、安全、线程、错误检查等,还有开发过程中的关注点,如易懂、易维护、易追查、易扩展等,图2.1演示了由不同模块实现的一批关注点组成一个系统。


2.1 把模块作为一批关注点来实现

通过对系统需求和实现的识别,我们可以将模块中的这些关注点分为:核心关注点和横切关注点。对于核心关注点而言,通常来说,实现这些关注点的模块是相互独立的,他们分别完成了系统需要的商业逻辑,这些逻辑与具体的业务需求有关。而对于日志、安全、持久化等关注点而言,他们却是商业逻辑模块所共同需要的,这些逻辑分布于核心关注点的各处。在AOP中,诸如这些模块,都称为横切关注点。应用AOP的横切技术,关键就是要实现对关注点的识别。

如果将整个模块比喻为一个圆柱体,那么关注点识别过程可以用三棱镜法则来形容,穿越三棱镜的光束(指需求),照射到圆柱体各处,获得不同颜色的光束,最后识别出不同的关注点。如图2.2所示:


2.2 关注点识别:三棱镜法则

上图识别出来的关注点中,Business Logic属于核心关注点,它会调用到SecurityLoggingPersistence等横切关注点。

public class BusinessLogic

{

    public void SomeOperation()

       {

              //验证安全性;Securtity关注点;

             //执行前记录日志;Logging关注点;

              DoSomething();

              //保存逻辑运算后的数据;Persistence关注点;

        //执行结束记录日志;Logging关注点;

}

}

AOP的目的,就是要将诸如Logging之类的横切关注点从BusinessLogic类中分离出来。利用AOP技术,可以对相关的横切关注点封装,形成单独的“aspect”。这就保证了横切关注点的复用。由于BusinessLogic类中不再包含横切关注点的逻辑代码,为达到调用横切关注点的目的,可以利用横切技术,截取BusinessLogic类中相关方法的消息,例如SomeOperation()方法,然后将这些“aspect”织入到该方法中。例如图2.3


2.3 将横切关注点织入到核心关注点中

通过利用AOP技术,改变了整个系统的设计方式。在分析系统需求之初,利用AOP的思想,分离出核心关注点和横切关注点。在实现了诸如日志、事务管理、权限控制等横切关注点的通用逻辑后,开发人员就可以专注于核心关注点,将精力投入到解决企业的商业逻辑上来。同时,这些封装好了的横切关注点提供的功能,可以最大限度地复用于商业逻辑的各个部分,既不需要开发人员作特殊的编码,也不会因为修改横切关注点的功能而影响具体的业务功能。

3、横切技术

为了建立松散耦合的、可扩展的企业系统,AOP应用到的横切技术,通常分为两种类型:动态横切和静态横切。

1)动态横切

动态横切是通过切入点和连接点在一个方面中创建行为的过程,连接点可以在执行时横向地应用于现有对象。动态横切通常用于帮助向对象层次中的各种方法添加日志记录或身份认证。在很多应用场景中,动态横切技术基本上代表了AOP

动态横切技术的核心主要包括join point(连接点),point cut(切入点),advice(通知)和aspect(方面)。在前面,我已经概要地介绍了这些术语分别代表的含义。接下来,我将以一个具体的实例来进一步阐述它们在AOP动态横切中实现的意义。

考虑一个电子商务系统,需要对订单进行添加、删除等管理操作。毫无疑问,在实际的应用场景中,这些行为应与权限管理结合,只有获得授权的用户方能够实施这些行为。采用传统的设计方法,其伪代码如下:

public class OrderManager

{

private ArrayList m_Orders;

public OrderManager()

{

       m_Orders = new ArrayList();

}

public void AddOrder(Order order)

{

    if (permissions.Verify(Permission.ADMIN))

    {

              m_Orders.Add(order);

    }

}

public void RemoveOrder(Order order)

{

    if (permissions.Verify(Permission.ADMIN))

    {

              m_Orders.Remove(order);

    }

}

}

同样的,在该电子商务系统中,还需要对商品进行管理,它采用了同样的授权机制:

public class ProductManager

{

private ArrayList m_Products;

public ProductManager()

{

       m_Products = new ArrayList();

}

public void AddProduct(Product product)

{

    if (permissions.Verify(Permission.ADMIN))

    {

              m_Products.Add(product);

    }

}

public void RemoveProduct(Product product)

{

    if (permissions.Verify(Permission.ADMIN))

    {

              m_Products.Remove(product);

    }

}

}

如此以来,在整个电子商务系统中,核心业务包括订单管理和商品管理,它们都需要相同的权限管理,如图2.4所示:


2.4 电子商务系统的权限验证实现

    毫无疑问,利用AOP技术,我们可以分离出系统的核心关注点和横切关注点,从横向的角度,截取业务管理行为的内部消息,以达到织入权限管理逻辑的目的。当执行AddOrder()等方法时,系统将验证用户的权限,调用横切关注点逻辑,因此该方法即为AOPjoin point。对于电子商务系统而言,每个需要权限验证的方法都是一个单独的join point。由于权限验证将在每个方法执行前执行,所以对于这一系列join point,只需要定义一个point cut。当系统执行到join point处时,将根据定义去查找对应的point cut,然后执行这个横切关注点需要实现的逻辑,即advice。而point cutadvice,就组合成了一个权限管理aspect


2.5 AOP动态横切的技术实现

由于aspect是一个封装的对象,我们可以定义这样一个aspect

private static aspect AuthorizationAspect{……}

然后在这个aspect中定义point cut,在point cut中,定义了需要截取上下文消息的方法,例如:

private pointcut authorizationExecution():

execution(public void OrderManager.AddOrder(Order)) ||

execution(public void OrderManager.DeleteOrder(Order)) ||

execution(public void ProductManager.AddProduct(Product)) ||

execution(public void ProductManager.DeleteProduct(Product));

由于权限验证是在订单管理方法执行之前完成,因此在before advice中,定义权限检查:

before(): authorizationExecution()

{

if !(permissions.Verify(Permission.ADMIN))

{

    throw new UnauthorizedException();

}

}

通过定义了这样一个完整的aspect,当系统调用OrderManagerProductManager的相关方法时,就触发了point cut,然后调用相应的advice逻辑。如此以来,OrderManagerProductManager模块就与权限管理模块完全解除了依赖关系,同时也消除了传统设计中不可避免的权限判断的重复代码。这对于建立一个松散耦合、可扩展的系统软件是非常有利的。

2 静态横切

静态横切和动态横切的区别在于它不修改一个给定对象的执行行为。相反,它允许通过引入附加的方法字段和属性来修改对象的结构。此外,静态横切可以把扩展和实现附加到对象的基本结构中。在AOP实现中,通常将静态横切称为introduce或者mixin

静态横切在AOP技术中,受到的关注相对较少。事实上,这一技术蕴含的潜力是巨大的。使用静态横切,架构师和设计者能用一种真正面向对象的方法有效地建立复杂系统的模型。静态横切允许您不用创建很深的层次结构,以一种本质上更优雅、更逼真于现实结构的方式,插入跨越整个系统的公共行为。尤其是当开发应用系统时,如果需要在不修改原有代码的前提下,引入第三方产品和API库,则静态横切技术将发挥巨大的作用。

举例来说,当前已经实现了一个邮件收发系统,其中类Mail完成了收发邮件的功能。但在产品交付后,发现该系统存在缺陷,在收发邮件时,未曾实现邮件地址的验证功能。现在,第三方产品已经提供了验证功能的接口IValidatable

public interface IValidatable

{

    bool ValidateAddress();

}

我们可以利用设计模式中的Adapter模式,来完成对第三方产品API的调用。我们可以定义一个新的类MailAdapter,该类实现了IValidatable接口,同时继承了Mail类:

public class MailAdapter:Mail,IValidatable

{

       public bool ValidateAddress()

       {

                     if(this.getToAddress() != null)

{

                          return true;

                 }

else

{

                          return false;

                 }

}

}

通过引入MailAdapter类,原来Mail对象完成的操作,将全部被MailAdapter对象取代。然而,此种实现方式虽然能解决引入新接口的问题,但类似下面的代码,却是无法编译通过的:

Mail mail = new Mail();

IValidatable validate = ((IValidatable)mail).ValidateAddress();

必须将第一行代码作如下修改:

Mail mail = new MailAdapter();

利用AOP的静态横切技术,可以将IValidatable接口织入到原有的Mail类中,这是一种非常形象的introduce功能,其实现仍然是在aspect中完成:

import com.acme.validate.Validatable;

 

public aspect MailValidateAspect

{

declare parents: Mail implements IValidatable;

 

public boolean Mail.validateAddress()

{

           if(this.getToAddress() != null)

{

                   return true;

          }

else

{

                   return false;

          }

       }

}

静态横切的方法,并没有引入类似MailAdapter的新类,而是通过定义的MailValidateAspect方面,利用横切技术为Mailintroduce了新的方法ValidateAddress(),从而实现了Mail的扩展。因此如下的代码完全可行。

Mail mail = new Mail();

IValidatable validate = ((IValidatable)mail).ValidateAddress();

3、面向方面程序设计的步骤

AOP的开发包括三个清晰的开发步骤:

第一,方面分解

分解需求提取出横切关注点和一般关注点.在这一步里,你把核心模块级关注点和系统级的横切关注点分离开来。就前面提到的信用卡例子来说,可以分解出三个关注点:核心的信用卡处理、日志和验证。

第二,关注点实现

各自独立的实现这些关注点,如上面的信用卡例子,要实现信用卡处理单元、日志单元和验证单元。

第三,方面的重新组合

在这一步里,方面集成器通过创建一个模块单元――方面,来指定重组的规则,重组过程也叫编织(weaving)或集成(integrating),使用这些信息来构建最终的系统。

 

四、面向方面与其他编程语言结合的应用情况

1Spring AOP

Spring AOP Spring 框架的重要组成部分,它实现了AOP联盟约定的接口。Spring AOP 是由纯Java开发完成的。Spring AOP 只实现了方法级别的连接点,在J2EE应用中,AOP拦截到方法级的操作已经足够。OOP倡导的是基于setter/getter 的方法访问,而非直接访问域,而Spring 有足够理由仅仅提供方法级的连接点。为了使控制反转(IoC)很方便的使用到非常健壮、灵活的企业服务,则需要Spring AOP 的实现。Spring AOP 在运行时才创建Advice 对象。Spring AOP的优点如下:

  允许开发者使用声明式企业服务,比如事务服务、安全性服务。
  开发者可以开发满足业务需求的自定义方面。
  开发Spring AOP Advice 很方便,可以借助代理类快速搭建Spring AOP 应用。

Spring中的事务管理实际上是基于动态AOP机制实现。Spring AOPAspect JJBoss具有很大的不同,首先,使用Spring AOP框架的用户要记住的一点是,Spring AOP针对的是方法层次上的实现,而其他两者对字段也提供了支持。为了实现动态AOPSpring在默认情况下会使用Java Dynamic Proxy,但是,Dynamic Proxy要求其代理的对象必须实现一个接口,该接口定义了准备进行代理的方法。而对于没有实现任何接口的Java Class,需要采用其他方式,Spring通过CGLib10动态创建一个子类来实现这一功能。

Spring 提供了AOP框架来实现调用方法时加入方面。在AOP框架中可以很方便的使用预定义的静态切入点来定义被调用的类和方法。我们需要通过Spring提供的代理类来产生代理对象,可以使用ProxyFactoryBean也可以使用自动代理。Spring AOP 的编程方式模块化了横向关注点的实现,提供了一个更好更快的软件开发方式。在软件结构日益扩大,结构日益复杂的今天,Spring AOP 将会发挥越来越重要的作用。

2JBoss AOP

AOP适合于开发J2EE容器服务器,目前JBoss4.0正是使用AOP框架进行开发的。具体的应用功能如下:

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging  调试

logging,tracing profiling and monitoring 记录、跟踪、优化、校准

Performance optimization 性能优化

Persistence  持久化 

Resource pooling 资源池

Synchronization 同步

Transactions 事务

JBOSSAOP架构负责处理AOP,使用了一组命名概念,比如"interceptor," "pointcut," “introduction”
一个interceptors编码拦截器”(intercepts),它把一个对象放到一个被拦截的类中。JBOSS允许你定义拦截器,这个拦截器被hook到构造方法和存取字段上。一个由pointcut定义的点被插入到拦截器类内部,他是一段定义在一个specific.xml文件中的XML代码。一个pointcut定义了已经拦截的(intercepted )和正在拦截的类的规范,它是一个可选项,可以通过XML文件中的过滤机制来选择它,所以只有规范的字段和方法会被拦截。拦截类扩展了一个invoke()方法,只要拦截类的方法或字段被访问这个方法就会被JBOSS AOP架构调用。结果是拦截者看不到外部系统和拦截类之间被插入了什么。

JBOSS4.0 AOP架构超出了简单的向一个类中注入行为的操作。它提出了引言的概念,这个引言是一个特定的拦截它在引导时把一个新的接口存储到类中。另外,引言提供了类的接口的实现。

3AspectWerkz

 

面军

AspectWerkz的原理是利用class loaderbootstrap class loader除外)在加载类时,从配置文件中读取必要的信息,修改类的行为(称为weave)。所以AspectWerkz可以处理字节码,这是他强大的一面,应该说,他比Nanning快了许多,根据AspectWerkz网站上的资料,在Pentium 4 2.56 Mhz, 512 RAM的机器上,每一个调用只会增加0.00025 ms的开销。AspectWerkz的语法是和AspectJ兼容的,但实现思路仍然相去甚远。

   AspectwerkzJonas BonerAlexandre Vasseur创建,它是目前最快速、功能最丰富的框架之一。虽然它还缺乏AspectJ的某些功能,但己足以满足大多数开发者在许多情形下的需要。

  Aspectwerkz最令人感兴趣的特性之一是它能够以两种不同的模式运行:联机模式和脱机模式。在联机模式下,AW直接干预属于JVM的底层类装入机制,截取所有的类装入请求,对字节码实施即时转换。AW提供了干预类装入过程的许多选项,另外还有一个替代bin/java命令的封装脚本,这个脚本能够根据Java版本和JVM能力自动生成一组可运行的配制。对于开发者,联机模式有许多优点,它能插入到任何类装入器并在类装入期间生成新的类。也就是说,我们不必手工修改应用程序的类,只要按通常的方式部署即可。不过,联机模式要求对应用服务器进行额外的配制,有时这一要求可能很难满足。

  在脱机模式下,生成类需要二个步骤。第一步是用标准的编译器编译,第二步是重点——以脱机模式运行AWcompiler编译器,让它处理新生成的类。编译器将修改这些类的字节码,根据一个XML文件的定义,在适当的point-cut插入advice。脱机模式的优点是AWcompiler生成的类能够在任何JVM 1.3以上的虚拟机运行

4nanning

nanning(是南宁的拼音,真有意思)是基于java.lang.reflect.Proxy 的思路实现的。在调用真正方法之前,nanning利用动态代理把调用切换到事先定义好的Interceptor中,从而实现了AOP的思路。Interceptor处理完自身后,讲调用转发到下一个Interceptor或是原先的方法。目前,nanning还只能支持方法调用和实例构造这两种拦截。所以nanning的功能比较简单,但已经可以实现不少功能了。Nanning的思路很好,但目前的开发人员极少,所以不论是功能,还是文档,都极为有限。

5AspectC

AspectC是把AOP引入到C语言的一次尝试。开发者已经开始内部使用AspectC系统,但还没有发布公共使用。AspectC采用的预处理方法似乎与AspectJ的相同,即对原始代码和adspect代码进行语法分析并将其编入最终的代码集。

6AspectC++

AspectC++AOP概念引入到C++编程语言。它的工作方式与AspectJ相同,它执行源代码的预处理并织入aspect代码来形成最终的C++源代码。然后使用适当的C++编译器编译该源代码。AspectC++已经在WindowsSolarisLinux上实现。

7AspectC#

C#中应用AOP,一种基于.NET平台的AOP技术,AspectC#.用户可以通过AspectC#C#中应用AOP.目前,AspectC#只支持C#语言,但是.NET平台的多语言性使得跨语言的AOP应用成为可能.

8Pythius

Pythius允许Python语言使用AOPPythius 用于添加AOP的概念到Python中。

9、几种常用的编译器

AspectJ开发工具有AspectJ1.0~1.2AspectJ1.5

AJDT是基于EclipseAspectJ的集成开发环境,它包含了最新版本的AspectJ,有AJDT1.2 for eclipse 3.0AJDT1.3 for eclipse 3.1

ACDT是在Eclipse中开发基于AspectC++程序的插件。

五、使用AOP的好处与不足

AOP做为一种新型的程序设计方法,它的出现有许多其他程序设计方法所不及的地方,但是也有很多需要改进的地方。经过研究发现有以下几个使用AOP的好处与不足。

1 使用AOP带来的好处

1)由于AOP的出现就是为解决横切关注点问题,因此,使用AOP首先带来的好处就是可以模块化横切关注点的实现,由此也使得代码有良好的可重用性。

2)使用AOP可以解决代码混乱和代码分散问题,这使得采用AOP实现的系统代码冗余小,也易于理解和维护。

3)由于方面模块根本不知道横切关注点,所以很容易通过建立新的方面加入新的功能。另外当你往系统中加入新的模块时,已有的方面自动横切进来,使系统易于扩展。

2 使用AOP的不足

1)AOP是一种新的编程技术,没有完整的文档,没有得到良好的测试和大量的实际项目的应用,作为一种新技术,还需要在实际工作中得到更多的检验。

2)目前,AOP在开发工具上还很缺乏,目前主要是基于JAVA上的AspectJ,而基于C#.NET以及其他语言上的开发工具都尚在研究中。关于什么是AOP分析、设计过程,设计和分解方面的基本原则,如何调试,什么是良好的方面模块等都有待进一步研究。

3)AOP的理论支持方面也有待进一步研究。如用什么理论能最好地描述方面与组件之间的交互等。

4)破坏了封装性;

5)需要专门的Java编译器

五、面向方面涉及的范围及现阶段的应用情况

自从2002年开始每年三月份都按期举行一届AOSD国际会议。面向方面软件开发涉及到广泛的领域,主要有以下几个方面:

aspects in software engineering:

  • evaluation and metrics
  • modular reasoning
  • evolution
  • requirements
  • testing aspects
  • software architectures
  • verification

aspect programming languages:

  • features for crosscutting concerns
  • domain-specific aspect languages
  • modular reasoning
  • aspect composition
  • aspect interference
  • type systems
  • semantics
  • compilation
  • program analysis
  • optimisation
  • dynamic weaving
 
 

connection between aspects and related paradigms:

  • model-driven architecture
  • generative programmin
  • meta-programming
  • program monitoring

 

 

 

applications of aspects:

  • performance improvement
  • concurrent systems
  • security
  • program monitoring
  • software product lines
  • distributed systems and middleware
  • persistence and transaction processing

tool support for aspects:

  • aspect mining
  • reverse engineering
  • program views
  • refactoring
  • interactive development environments

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值