您的位置:首页 > 运维架构

AOP技术应用和研究--AOP语言

2014-09-17 20:28 232 查看

1,AOP语言概述

如同其他软件开发方法的演化过程一样,对的研究最早也是从程序设计语言的变化开始的,其中最具代表性的当属PARC研究中心对 扩展后所开发的AspectJ,并在其后出现了大量面向商用或学术研究的AOP语言以及技术文献,从而为相关研究奠定了强大的发展基础和动力。近年来,针对的研究早已超出传统的程序设计语言领域,并逐步扩展到整个软件生命周期以及各种支持工具和开发环境的研究和应用,而被统称为面向切面的软件开发方法(aspect-oriented
software development)。AOP语言作为一种技术基础和核心,其实也就是AOP工具,正在改变和影响着我们软件开发。

AOP语言所编写的程序通常由基础程序(base program)和切面程序(aspect program)所组成。基础程序由称为基础语言(base language)的传统程序设计语言所编写,负责实现系统的核心关注点;而方面程序作为对基础程序的补充和扩展,在语言层次上提物了对横切关注点的模块化实现,通常由称为切面语言(aspect language)的专门AOP语法模块编写。表3.1列出了部分典型的AOP语言及其相应的基础语言。
                   

  

当前大多数AOP语言都是在某种语言的基础上进行扩展后得到的,这也是因为AOP最初就是作为对OOP的补充和完善而提出的,因此OOP语言自然成为这AOP语言的基础语言,并基本涵盖了所有常见的OOP语言, 如Java、C++、SmallTalk等, 其中又以Java作为基础进行扩展的情况最为常见。同时,在典型AOP语言中也采用其他类型的程序设计语言作为其基础语言,如C等命令式语言,以及某些函数式语言。还有一些语言是针对特定平台或应用领域设计的,其基础语言较为特殊。例如基于.NET平台所开发的Weave.NET、SourceWeave.NET、AspectBuilder,可以同时使用多种语言作为其基础语言,只要这些语言遵循.NET平台的公共语言架构(common
languageinfrastructure)规范[20]。本文将着重研究Spring AOP和AspectJ的实现和应用。

2,AOP语言实现机制

由2.1~2.5,我们可以发现AOP技术中核心就是将我们横切关注点编织到核心业务关注点,从而形成连接点。也就是将我们通知的代码编织到目标方法中。这个过程就是编织。编织也就是我们AOP语言要实现的。

    2.1编织

编织(weaving)是实现AOP的一个核心机制,利用切面编织器将用AOP实现的方面代码织入到用00P实现的核心功能代码中。从而构建了最终系统。编织的实现机制有多种,从编织的过程来看可以分为两类:静态编织与动态编织;而根据编织发生在应用程序生命周期的不同时刻又可以分为三类:编译时编织、载入时编织和运行时编织。图3.2列出了几个当前比较流行的AOP工具所支持的编织方式[21]。

2.2静态编织和动态编织

静态编织是指在核心功能代码中的适当位置。比如某段代码执行前,或执行后,将切面代码织入。从而形成混合的编码;而动态编织可以在程序运行时。根据上下文决定调用的切面和它们的先后顺序以及增加或删除一个切面等。利用静态编织的工具有AspectJ、AspectC++等;其他一些使用反射技术或运行时代码织入技术的体系结构都属于动态编织,这样的工具有Spring AOP等。静态编织中出于方面代码在程序运行前已被内联至核心功能代码中。代码被高度优化,因此执行速度与未使用AOP方式编写的代码相差无几,对性能几乎没有影响:而动态编织山于引入了额外的抽象层,性能会有一定降低。但是,静态编织技术会改变类的源代码,而且需要在设计时就要确定所有的方面;而动态编织技术则不会,它可以在运行时增加、修改和删除方面。

    2.3 不同的编织时刻

正如可以用不同的机制编译和执行OOP程序那样。AOP语言为构建和执行切面提供了不同的工具。切面编织器提供了按照切面中切人点指定的方式自动调用通知的搭配方式,切面的编织对于性能和可伸缩性有影响.其中大部分取决于编织发生在应用程序生命周期的哪一部分。

(1)编译时编织可以在编译前进行预处理。将两种代码自动混合。将切面中的代码自动插人到功能模块代码的合适位置处,也可在编译后,对编译后的代码进行操作。对于普通应用程序而言,在编译时进行编织操作是最为直观的做法。由于源程序中包含了应用的所有信息。因此这种方式通常支持最多种类的连接点。利用编译时编织,我们能够使用AOP系统进行细粒度的编织操作。编译时编织最典型的框架就是AspectJ,它是目前最完善的AOP语言。AspectJ是对Java编程语言的扩展,通过增加了一些新的构造块支持对横切关注点的模块化封装。对源代码级别的代码混合实现编织.是一种典型的使用静态编织的AOP实现机制。AspectJ中预定义了一系列标准切人点,包括方法与构造器的调用、接受调用、执行、域的get和set访问、异常处理、实例类型匹配以及类型的初始化,通过这些预定义切人点的组合可以实现自定义的、复杂的切入点。在编译时,切面中的通知将被转化为标准的方法,类代码中匹配切人点的连接点将被转化为一个静态的标记点,然后。这些静态的点将被由通知所转化成的方法调用所取代。由此完成两种代码的编织,最后对编织完成的代码编译为字节码,即完成了整个编译过程。目前,AspectJ即支持编译前的预处理方式实现代码的编织,也支持编译后的字节码操作。支持编译时编织的框架还有Aspectc++和Aspeclweikz等。编译时编织会带来开销。主要是内存和时间的使用,因为它是在编译时执行大部分通知。在大型项目中,这些开销有可能是很可观的.而且可能帮来一些问题,特别是在切入点发生变化时。大部分系统都需要重新编译。然而编译时编织也意味着在运行的时候.几乎不需要为了匹配切人点做额外的工作。
(2)载入时编织是在代码载入时,实现代码的编织。程序的主逻辑部分和Aspect部分可以分别进行开发和编译,而编织操作就发生在框架载人Aspect代码之时。Aspect werkz、AspectJ、Spring和JBoss都支持载人时编织。Aspect werkz是一个动态的AOP框架。在类载入层次的适当位置拦截类载人从而实现字节码的修饰。利用对字节码的修改实现方面的织人,通过引人一个被称为切面容器的间接层以及对字节码的转化来实现动态AOP的要求。
(3)运行时编织是指在运行时根据对方法的调用执行适当的方面代码以实现编织。运行时编织可能是所有编织方式中最为灵活的。程序在运行过程中可以为单个的对象指定是否需要编织特定的Aspect。运行时编织采用的编织技术有反射、动态代理和拦截器。

SpringAOP则侧重于在运行时使用动态代理和拦截器调用方面。动态代理源于代理模式,即通过接口实现对业务对象的访问。但动态代理无需为每一个需代理的业务对象静态的生成代理对象。只需提供需要代理的接口与代理实现,就可以在运行时动态的生成代理对象。代理对上述接口的访问。Spring框架的核心是IoC容器,默认使用jdk提供的动态代理机制。在运行时.通过IoC容器进行名称查找,就可以由容器使用代理机制自动产生代理对象,并在符合切人点定义的连接点处执行通知。拦截器可以根据一个或多个切入点找到要切人的代码部分然后将方面代码织人,使用运行时拦截框架的关键好处是:它很自然地扩展到了切面的热部署(hot
deployment),这味着可以在运行时激活或禁用所应用的通知。对于运行时编织来说,编译时的内存和时问开销可以忽略不计。但是运行时的通知调用开销是很大的。

3,AspectJ

AspectJ 是一个可免费获得的,由施乐公司帕洛阿尔托研究中心开发的扩展Java 的AOP 实现。它既是一个语言规范,又是一个AOP 语言实现。语言规范部分定义很多种语言构造以及它们支持面向切面范型的方式;语言实现部分则提供了编译、调试以及从代码生成文档的工具。AspectJ 的语言构造是从Java语言中扩展而来的,因此所有合法的Java 程序也都是合法的AspectJ
程序。AspectJ 编译器生成的是符合Java 字节码规范的.class文件,所以所有符合规范的Java 虚拟机都可以解释、执行其所生成的代码。通过选择Java 为基础语言,AspectJ 继承了Java 的所有优点并使Java 程序员能够比较容易上手。它不但提供很多有用的工具,还提供了对流行的IDE 的集成,如Sun 的Forte,Borland 公司的JBuiider 以及Emacs 等,这使得AspectJ 成为一个很容易使用的AOP 实现。AspectJ具体实现的例子将在3.5 AspectJ实现中介绍。

4,SpringAOP

Spring Framework是一个开源的Java/Java
EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本。该框架基于Expert One-on-One JavaEE
Design and Development(ISBN 0-7645-4385-7)一书中的代码,最初由Rod Johnson和Juergen Hoeller等开发。Spring Framework提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。

Spring框架作为一个开源的项目,正作为一种轻量级框架得到越来越广泛的重视和使用。Spring AOP是Spring框架中的一个重要组件,作为一种非侵略性的,轻型的AOP 框架,开发者无需使用预编译器或其他的元标签,便可以在Java 程序中使用它。如图3.3是Spring体系结构:

                    


Spring提供了一个用标准Java 语言编写的AOP框架,Spring 实现AOP的途径不同其他大部分AOP框架。它的目标不是提供极其完善的AOP 实现,而是提供一个和Spring IOC 紧密整合的AOP 实现,帮助解决企业应用中的常见问题。因此,Spring AOP 的功能通常是和Spring IOC 容器联合使用的[19]。(当然我这里只是简单的介绍一下SpringAOP,在后续的文章我们将进一步讨论它。)

AOP技术应用和研究系列博客
AOP技术应用和研究
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息