软件工程毕业设计(论文)基于AOSD 的数字图书馆体系结构.doc

上传人:文库蛋蛋多 文档编号:3994111 上传时间:2023-03-30 格式:DOC 页数:36 大小:4.64MB
返回 下载 相关 举报
软件工程毕业设计(论文)基于AOSD 的数字图书馆体系结构.doc_第1页
第1页 / 共36页
软件工程毕业设计(论文)基于AOSD 的数字图书馆体系结构.doc_第2页
第2页 / 共36页
软件工程毕业设计(论文)基于AOSD 的数字图书馆体系结构.doc_第3页
第3页 / 共36页
软件工程毕业设计(论文)基于AOSD 的数字图书馆体系结构.doc_第4页
第4页 / 共36页
软件工程毕业设计(论文)基于AOSD 的数字图书馆体系结构.doc_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《软件工程毕业设计(论文)基于AOSD 的数字图书馆体系结构.doc》由会员分享,可在线阅读,更多相关《软件工程毕业设计(论文)基于AOSD 的数字图书馆体系结构.doc(36页珍藏版)》请在三一办公上搜索。

1、摘要面向方面编程是在现有的面向对象编程的基础之上,通过引入一个“方面”(相对于核心类而言)概念而产生的。它在实现上分离和模块化系统的横切关注点。先分离出方面模块,随后再织入到核心类中。面向方面的软件开发方法使横切于整个系统中的关注点的实现更具有模块性,容易实现系统的演化。系统功能构件设计时不需要考虑散杂在对象中的关注点,这样提高了模块的可追踪性、模块的可重用性、系统的可维护性。面向方面建模在软件开发的各个阶段用一致的方法来详述、可视化、构造和文档化方面相关产品,这样在整个软件开发过程可以使用面向方面技术。数字图书馆是一个十分复杂庞大的系统,有很多非功能需求,且这些非功能需求往往横切整个系统,如

2、日志、性能问题、安全、上下文相关错误处理、Qos监测等等。传统的系统分析设计的方法难以保证开发的效率和质量。这就要引入面向方面的开发方法,以设计更为合理的系统,加速开发进程,改进软件的质量,方便地集成已有的数字图书馆信息资源,减轻数字图书馆开发的复杂性。另外使用AOP的方法组建系统也利于满足数字图书馆的日益增长的扩展需求。关键字: 方面; 面向方面的软件开发; 统一建模语言; 数字图书馆AbstractThe Aspect-Oriented paradigm builds on the existing Object Oriented paradigm by introducing the n

3、otion of an aspect as opposed to a core class. The AOP separates and modularizes crosscutting concerns at implementation stage. Using this technique, aspects are placed in separate modules that are then woven together with base classes to form an application. The AOP makes the implementation of the

4、crosscutting concerns of the system more modularized ,and more easy to implement the evolvement of the system.It is unnecessary to consider the crosscutting concerns of the system when we design the function component of the system. Consequently it increases the traceability, reusability and adaptab

5、ility of software .Aspect-Oriented Modeling (AOM) specifies, visualizes, constructs and documents aspect related artifacts in a consistent way at other stage of software development. Thus whole software development process can use aspect-oriented technique. The digital library is a so complex system

6、 with many non-functional concerns , such as logging, performance analysis, security, context related error handling, QoS monitoring, etc(always scatter in the whole system) . So the it is very difficulty to guarantee the efficiency and quality of the software with traditionary methods of systems an

7、alysis and design . In order to design more logical system, accelerate development process, improve quality of software, we adopt the Aspect-Oriented software development .It also makes it more convenient to integrate resource of these existing digital library, and alleviates the complication of dig

8、ital librarys development . Otherwise with AOP to build system is favourable to satisfy the increasing extending requirement of the digital library.Keywords : aspect; AOSD; UML; the digital library第一章 绪论11 面向方面编程的发展现状上世纪90年代中期,施乐公司的帕洛阿尔托研究中心(XeroxP ARC)首先提出了AO的编程技术。但是由于当时软件开发主要偏重于对软件功能的实现,而面向对象(00)可

9、以很好的满足要求,因此AO并未取得多大的发展。然而从上个世纪末至今,由于互联网中分布式系统的广泛应用,用户对软件的非功能需求(安全性,健壮性等)亦提出很高的要求,00的不足之处和AO的优势便凸显出来,从而吸引了大批研究人员开始对AO进行研究:如对开发方法的改进;对体系框架的重新设计使其满足特定的需求;对AO概念、细节的补充、完善以及对原来各种语言添加AO特性等。虽然现阶段的AO还处于相当不完善的阶段:它只能应用于很少的几种语言环境下并且必须掌握源代码才能进行织入,还有许多概念没有同一和完善。但以RUP之父工var Jacobson为代表的科学家们仍对AO推崇备至,他们认为AO将最终改变整个软件

10、开发方式,并且更完美的实现“用例驱动”的开发思想目前主流的程序设计技术是面向对象的程序设计,这种思想将数据及其相关的行为抽象为单独的概念或物理实体,表现了良好的封装性和模块性。在编写复杂程序,比如图形用户界面、操作系统和分布应用程序等,以及维护源代码的可理解性方面,OOP表现了强大的能力。但是人们也发现,对象技术不能很好地处理如下问题:将牵涉到全局限制和总体行为的系统责任局部化;适当地分解需求和划分系统责任,使之能够模块化地实现;应用领域特定知识。实际上,不管是采用OOP技术还是过程型技术,都不能很好地解决这些问题。AOP的出现,正是为了改进上述程序设计方法学的不足。AOP被视为是后面向对象时

11、代的一种新的重要的程序设计技术。AOP中处理横切关注点的方法非常类似于C+语言里面的内联函数或者公共类的调用,区别在于:内联函数是一个被明确定义了的函数,出现在类的内部。而AOP中,没有在类的内部明确定义类似于内联函数这样的东西,而是在类的外部,把类的某个成员函数,比如类的属性的读写,公共函数,公共方法等定义为切入点,然后控制在切入点上执行相应的横切关注点。从上述的比较中可以看到,AOP技术在处理系统横切关注点时是优于OOP技术的。但是,这并不意味着AOP技术是可以取代OOP技术的。相反,它的出现只是可以很好的弥补OOP在处理横切关注点时所表现的不足。对于系统中核心关注点的实现,仍然需要使用O

12、OP技术。而在处理横切关注点时,可以使用AOP技术对横切需求进行模块化实现。从广义上说,AOP是OOP技术的发展。12 国内外数字图书馆研究概况数字图书馆是一种拥有多种媒体、内容丰富的数字化资源,是一种通过数字手段为用户方便、快捷地提供信息的服务机制。数字图书馆(Digital Library)这一概念最早是20世纪90年代初由美国科学家提出的。“Digital”侠义上可理解为“图书馆”的意思,这是相对于传统图书馆而言;广义上“Digital”可理解为“库”的概念,它是众多数字化信息和服务的集合。从根本上说,数字图书馆的目标是为了解决网络环境下的数字化信息资源的组织、查询与服务问题。它所处理的

13、对象是网上的数字信息,希望能提供类似于传统图书馆的良好的信息服务,如有序化的组织、结构化的存储、高效的检索以及友好的查询等。数字图书馆组织了一系列与平台无关、面向对象、分布式的数字化信息资源并且提供相关的服务,它应该具有以下一些特征24:(1)数字图书馆拥有海量的数字化资源,其信息度量单位不再是KB、MB,而是GB、TB甚至PB。数字化的资源又是多种媒体(如文字、图像、音频、视频、虚拟空间等)的,具有多种存储和压缩格式。(2)数字化资源并不是孤立的,而是相互关联的动态的。数字图书馆是数字化资源的统一,可以通过一定的相关关系,由特定的协议和存取方法来查找和访问这些数字化资源。(3)数字图书馆必须

14、为用户提供统一的访问手段,能够让用户透明方便地获取所需的信息而不必关心这些信息的具体位置。对数字资源的检索应该是智能化、交互式的,对全文、多媒体信息、多语言信息的检索都可以达到很好的查全率和查准率。(4)数字图书馆建立在异构平台上,具有分布、开放的信息结构,高速、可靠的网络环境是其运行的基础。它突破了时间、空间的限制,让用户可以在任何地方、任何时间获取自己所需的信息。在此基础上提供的导航式和个性化的服务,使服务内容更多样、服务模式更广泛,这是对传统图书馆服务功能的突破。数字图书馆咨询系统外部信息源:电子出版物网络数据库虚拟图书馆本地数字化信息源:书目信息电子书刊光盘数据库本地非数字化资源:印刷

15、型图书、杂志各种缩微资料各种视听资料用户图1 数字图书馆模式数字图书馆的模式,可以用图1简单说明,通过图1也反映出数字图书馆的基本特征。用户通过网络和通信系统,连接到数字图书馆的咨询系统,通过这个统一的访问界面,用户可以透明地获取各种信息资源。13 本课题的来源、研究目的和意义在信息技术迅猛发展及基于Internet网络应用日益普及的今天,传统图书馆正在向自动化、网络化、电子化的数字化方向发展,这是目前网络信息资源开发和研究的热点。数字图书馆的建设涉及到信息资源数字化、多媒体数据库、分布式网络、信息管理系统结构等多方面的问题,需要有效地集成和应用最新的信息技术。如何在宏观上有效地把握和组织,并

16、运用到数字图书馆的开发建设上,是数字图书馆研究的重点。UML(The Unified Modeling Language,即统一建模语言)是一种编制系统蓝图的标准化语言,可以对复杂的系统建立可视化的系统模型,目前已经被工业标准化组织OMG(Object Management Group)接受,一经推出便得到许多著名的计算机厂商如Microsoft、HP、IBM、Oracle等的支持,在国际上的应用日益广泛。数字图书馆的开发建设是一个复杂的软件工程,需要集成不同的操作系统、数据库和应用软件,有众多不同级别的用户、管理员,满足图书馆从书目查询、普通和电子书刊借阅到提供网上信息服务、资源共享等各种需

17、求。用传统的系统开发和集成的分析设计方法难以保证效率和质量,UML的特点及数字图书馆的要求,决定UML在数字图书馆中应该有很好的应用前景。以前关于AOP的研究主要集中在把面向方面的原理整合到软件的最后实现里的编程技术,近年来,研究者开始考虑如何在软件开发过程中建模方面,这主要集中在如何扩展UML以支持方面建模 , 中建议在UML中加入两个新的元素,一个代表连接点(join point)的概念,方面在连接点横切功能组件,一个代表方面,并建议把方面的功能封装在一个UML包中来维护关注点分离。 在没有破坏当前UML说明书的情况下对UML进行扩展,它加入了新的构造型(stereotype)aspect

18、,并提出了基于XML的方面描述语言UML/a,这样支持开发工具与方面编织器之间的方面模型信息的交换。 提出了一个使用UML表示的方面开发的方法学,也提出了一个方面约束语言ACL(Aspect Constraint Language)来约束方面的使用,这样允许控制开发来避免出现不希望的后果。把面向方面编程技术应用到数字图书馆系统开发上。因为在数字图书馆系统里有许多横切的特征,当前的数字图书馆的建设多采用面向对象的设计方法OOP可以成功的对核心关注点实现模块化,并降低模块间的耦合度;而AOP可成功的对横切关注点实现模块化,并降低横切模块与核心模块间的耦合度。那么对于像数字图书馆这样复杂庞大的系统难

19、免会出现面向对象设计方法无法解决或解决不好的问题,这就要引入面向方面的开发方法,以设计更为合理的系统。另外使用AOP的方法组建系统也利于满足数字图书馆的日益增长扩展的需求数字图书馆系统在现在社会和国家生活中应用越来越广泛,影响也越来越大,系统也越来越复杂。根据上述数字图书馆系统特点和面向方面开发的特点,可以得出把面向方面技术应用到数字图书馆系统中很有必要。14 本课题研究的思路和主要内容本课题要研究如何把面向方面技术应用到数字图书馆系统开发中。数字图书馆系统是面向方面很好的应用场所,因为在数字图书馆系统中,有很多非功能需求,且这些非功能需求往往横切整个系统。这些非功能需求散布在整个系统的功能部

20、件里,带来了前述的代码混乱和代码分散问题,导致系统代码不易读,不易修改,易产生不一致,重用性差,不易修改和不易升级等一系列问题。例如数字图书馆有安全上的需求,以防止非授权用户的进入,同时维护相应权限用户的操作范围,同样这些非功能性代码也会弥漫在整个系统中。本文比较完整地分析介绍面向方面的编程方法,详细介绍了AspectJ并对面向方面建模进行了研究;提出了一个新的通过扩展UML进行面向方面建模的方法,并进一步扩展它,使其更方便对数字图书馆系统建模。论文结构安排如下:第一章介绍了面向方面编程的现状;介绍了数字图书馆的发展现状并分析了数字图书馆系统中的非功能关注点。第二章介绍了面向方面编程的方法。第

21、三章提出了一个新的扩展UML来表达面向方面中的元素和机制。第四章使用扩展的UML对数字图书馆建模第二章 面向方面编程方法的研究AOP的基本思想是对横跨多个模块的关系进行模块化,从而把这些关系从模块当中分离出来。分离出来的关系,是一个独立的模块,可以单独对它进行编程、修改,使用编织器把这个模块插入到原有的代码里面。这种插入可以是动态的,也可以是静态的。在理论研究的基础上,施乐公司开发了一个支持AOP功能的程序设计语言,AspectJ。2.1 面向方面的开发方法AOP技术随提出不久但在已经在如下领域提供了有意义的原型:应用服务器、操作系统内核、实时分布式事件通道、分布式中间件、分布式质量服务、多智

22、能体系统结构、对象数据库、领域相关的可视化建模、协作、工作流、电子商务、软件可视化、工程设计及数据处理。下面我们就介绍一下关注点及其分离的方法,并详细介绍AspectJ。2.1.1 关注点要理解AOP,就必须理解什么是关注点,什么是横切关注点? 从技术上来讲,一个复杂的软件系统可以被看成是多个核心级和系统级关注点的组合实现 。用于完成系统核心模块级需求的关注点被称为核心关注点,它用来完成系统的核心业务功能。系统 中 有 许多系统级需求是相互独立的,但它们一般都会横切许多核心模块。用于完成系统级需求的关注点被称为横切关注点,它用来处理横跨多个模块的系统级外围需求。一个典型的企业应用需要处理的横切

23、关注点,如用户认证、记录日志、资源池、系统管理、性能、存储管理、数据保持、安全保密、多线程安全、事务完整性、错误检验、策略实施等。所有这些关注点都可以横切数个子系统。对于如何有效的分离关注点,人们已经提出了很多方法。如AspectJ、组合过滤器、多维关注点分离和自适应编程等。2.1.1.1 组合过滤器(Composition Filters, CF)组合过滤器模型可以追溯到1980s,在之后的时间里,该模型从建立在单个对象上的单线过滤器模型向着在多个对象上分别叠加特定的过滤器模型的方向发展。组合过滤器是通过为每个关注点定义一个过滤器来实现关注点分离的,每个过滤器类负责处理其相关关注点的所有方面

24、。CF的关注点声明包括三部分:过滤器模型,叠加规范和实现。只有实现的关注点声明对应于传统程序中的一个元素(如类)。过滤器模型用于表示横切关注点。它们使用了一种公开的消息处理语言,这种语言基于一些元语和/或过滤器模型。过滤器模型通过一个可声明的基于约束的叠加声明,附加在对象实例上。多个关注点可以在同一个对象上叠加它们的过滤器模块。组合过滤器的规范模型假设,通过管理对象的交互模式,方面可以附加在对象上。消息的操作是通过使用过滤器模块声明语言的组合操作,叠加过滤器模块实现的。组合过虑器方法支持不同的过滤器类型,从原始的语言无关的过滤器到用户定义类型的声明。组合过虑器的目标是实现语言无关性,以及方面组

25、合的易验证性。由于它们的声明本质,方面可以在编译时、运行时,或同时进行组合。从抽象型约束的观点来看,这种方法限于在交互程序模块的层此上添加方面。组合过滤器的标准化约束是多种语言的公共交互接口。 图22左边显示了对关注点A的关注声明,包括两个过滤器模块、一个叠加声明和一个实现。图的右侧是另一个关注声明B,它只包括过滤器模块和叠加声明。图中间是一个关注实例的例子A,是关注点A的实例包括由A定义的实现和一个由A叠加的过滤器模块,以及被B叠加的额外的过滤器模块。过滤器机制使程序员有机会捕获所有直接接收和发送的消息,在方法代码实际执行前执行特定的行为。结果代码因此被很好的分解成专用目的的关注点(在过滤器

26、中)和基本关注点(在方法中)。2.1.1.2 多维关注点分离为 了控 制 软件的复杂性,提高软件的可理解性,软件开发需要把系统分解为小的可管理的模块,然后组合这些开发好的模块得到完整的系统。为了方便软维护与演进,要求减少改变带来的影响,要求模块的可替换性以及提高软件生命周期过程中各种制品间的可追踪性。虽然在这些领域进行了很好的研究与应用,但这些问题仍然存在,这主要是由于当前软件开发方法一次仅支持一种关注点的分离。如面向对象支持对象的分离,把数据封装在一起,但是阻碍了特征的演进与增加,因为这需要修改和增加多个类里的方法和数据,需要侵入系统内部。即问题原因在于“主分解专制,(tyranny of

27、the dominant decomposition) 。为了达到软件工程的目的,就需要同时分解多种关注点。多维关注点分离(multi-dimensional separation of concerns, MDSOC)要求支持任意多的关注点维数,能同时沿着这些方向分解关注点,能动态处理新的关注点新的分解方向,能处理重叠交织的关注点。使用这种方法,模型是使用原始单元(如操作和属性)和复合单元(如类)建立的,每个模型表示了一种解决方案和一个给定的尺度(如一致性)。超切片(hyperslice)用于捕获这种模型。多个超切片可能同时存在;不同的超切片之间可能彼此冲突。在不同超切片中的模型通过组合规则

28、的应用集成为了一个系统。这些规则也描述了如何解决冲突。允许定义多个模型,组合规则的灵活性避免了方面和组件之间的差异。从抽象型约束的观点来看,改方法的规范模型很通用。它可以被认为是设计模型,而不是语言模型。该方法的某些专门实现选择了定义专门的元语、复合单元及组合规则。这个标准化约束是由已有的实现工具实现的。例如java的超切片语言Hyper/J的实现平台。目前在超切片中定义的模型和组合规则将该方法限制为方面的静态组合。2.1.1.3 自适应编程自适应编程是一种基于代码模式的编程模型。代码模式是按不同的类别划分的,每个模式捕获了编程中的抽象:l 传输模式 定义在数据上的操作(算法)。传输模式标志了

29、为特殊操作而交互的类的子图。对数据的引用是通过附属子图声明,以一种结构化隐含方式实现的,实际的代码在沿传输路径的代码封装器中进行定义。l 传输模式 抽象了参数化过程。它们用在传输模式中,沿着子图将参数传进带出。l 同步模式 在并发应用中定义了对象间的同步机制。它们的目的是控制进程对操作执行的访问在自适应编程编程中,每个模式类处理了不同的关注点,可以作为高层软件组件,它们通过名字消解,以一种松散耦合的方式与其它组件交互。每种模式准独立于其它模式和数据组织。然而,这样会产生一些影响,例如,在类组织中的变化不一定导致模式中的修改,对算法(传输模式)的修改不一定导致同步机制的改变。2.1.2 面向方面

30、的开发步骤方面分解机制将系统分解为系统核心功能和贯穿系统的需求横切关注点,系统核心功能可以通过面向对象或结构化方法实现编码,而横切关注点则需要AOP 语言的支持形成方面代码,这两个过程是独立并行的,最后通过AOP 语言的联结机制将方面代码联结到功能代码中,形成最终的系统代码。图23 AOSD 的基本原理AO包括三个清晰的开发步骤:(1)方面分解:分解需求撮出横切关注点。在这一步里,把核心模块级关注点和系 统 级 的 横 切 关 注点分离开来。(2)关注点实现:各自独立的实现这些关注点。(3)方面的重新组合:在这一步里,方面集成器通过创建一个模块单元(方面)来指定重组的规则, 重组过程(也叫织入

31、(weaving)或结合(in te gra ti ng )则使用这些信息来建构最终的系统。AO与00最重要的不同在于它处理横切关注点的方式。在AO中每个关注点的实现都不知道其它关注点是否会“关注”它,如信用卡处理模块并不知道其它的关注点实现正在为它做日志和验证操作。它展示了一个从00转化来的强大的开发范型。一个AO实现可以借助其它编程范型作为它的基础,从而原封不动的保留其基础范型的优点。例如,AO可以选择00作为它的基础范型,从而把00善于处理一股关注点的好处直接带过来。用这样一种实现,独立的一般关注点可以使用OOP技术、这就像过程型语言是许多00语言的基础一样。2.2 AO语言介绍就像其他

32、编程范型的实现一样,AO的实现由两部分组成:语言规范和实现语言规范描述了语言的基础单元和语法:语言实现则按照语言规范来验证代码的正确性,并把代码转成目标机器可执行的形式。2.2.1 AOP语言规范从抽象的角度看来一种AO语言要说明下面两个方面:(1)关注点的实现:把每个需求映射为代码,然后,编译器把它翻译成可执行代码。由于关 注点的实现以指定过程的形式出现,你可以使用传统语言如C,C+,JAVA等 。(2)重组规则规范:怎样把独立实现的关注点组合起来形成最终系统呢?为了这个目的需要建立一种语言来指定组合不同的实现单元,以形成最终系统的规则。 这种指定织入规则的语言可以是实现语言的扩展,也可以是

33、一种完全不同的语言。2.2.2 AO语言的实现AOP的编译器执行两步操作:(1)组装关注点(2)组装结果转成可执行代码AO实现可以用多种方式实现重组,包括源码到源码的转换、它预处理每个方面的源码,产生重组过的源码,然后把重组过的源码交给基础语言的编译器,产生最终可执行代码。比如:使用这种方式,一个基于Java的AO实现可以先把不同的方面转化成Java源代码,然后让Java编译器把它转化成字节码。(AspectJ即如此)也可以直接在字节码级别执行织入:毕竟字节码本身也是一种源码。此外,底层的执行系统 Java虚拟机 也可以设计为支持AO的。基于Java的AO实现如果使用这种方式的话,虚拟机可以先

34、装入重组规则,然后对后来装入的类都应用这种规则、也就是说,它可以执行just-in-time的方面重组。2.3 AspectJ介绍AspectJ是一个可免费获得的、由施乐公司帕洛阿尔托研究中心(Xerox PARC) 开发的、Java的AOP实现。它使用java作为单个关注点的实现语言,并扩展Java以指定重组规则。Asp ec tJ 的织入器(AspectJ的编译器)负责把不同的方面组合在一起,由于AspectJ编译器建立的最终系统是Java字节码,因此,它可以运行在任何符合Java标准的虚拟机上。而且 , AspectJ还提供了一些工具。AspectJ的开发工具由一系列的命令行和图形界面工

35、具组成。并提供在线的帮助文档。命令行工具包括:(1)一个AspectJ语言的编译器(ajc);(2)一个针对ajc合成的Java类文件的调试器(ajdb);(3)一个用于产生HTML格式的横切点结构文档的文档产生器(ajdoc)。图形界面工具包括:(1)用于浏览横切点结构并可调用aj。进行编译的AspectJ浏览器(2)支持Jbui1der和Fortea nde nvironments upportf orG NUE macs/Xemacs的AspectJ开发环境(AJDE)其中的每一种工具都是作为Java-based GUI installer自解压的来发布的。安装程序通过调用”java一j

36、ara spectj-tools.ja r”命令来激活。而AspectJ在编译时,编译器的前端负责将AspectJ源文件转换成类文件。它是作为对Eclipse Java开发工具(JDT)编译器的扩展而构建的,方面被编译成一些类文件,它们包含通知方法、类型间声明,具有切入点、通知,以及编码在常量池中的属性的其他AspectJ专用信息。编译器(编织器)的后端实现了由编码属性指定的字节码转换,产生类文件的最终链接版本。图24 提供了编译过程的总览。AspectJ是一种有严格语法的AO语言。它定义了一系列语言结构,包括:连接点,切入点,通知,引入和方面.其中切入点和通知可以动态的影响程序流。另外,As

37、pectJ允许以多种方式用方面和类建立新的方面,你可以引入新的数据成员和方法或是声明一个新的类来继承和实现另外的类或接口。在AspectJ中,编译织入规则与核心模块的过程被称为横切。织入规则实现了模块化横切关注点,并以系统化的方式将它们横切多个模块。AspectJ定义了两种横切方式:动态横切和静态横切。动态 横 切 是在程序的执行过程中织入新的行为。AspectJ中,大部分横切是以动态形式发生的。动态横切通过横切模块的方式扩展或取代了核心程序的执行流,以此来修改系统的行为。静态 横 切 是对系统中的静态结构一一诸如类、接日和方面进行修改。静态横切并不对系统的执行行为进行修改,它是用来支持动态横

38、切实现的。例如,在动态横切的行为中增加静态横切的元素-一一新的数据成员和方法用来定义特殊的类或接口而无须对原类或接口的代码做任何修改。方面将动态横切和静态横切的实现封装起来,通过方面编译器将方面与核心组件进行织入,编译完成的字节码可以被Java虚拟机识别u1整个编译过程展现了采用面向方面技术进行软件开发的核心思想。2.3.1 织入在AspectJ中,“织入”是一个重要的概念,它体现了方面与模块之间的耦合关系。织入规则说明了在程序执行到某个点时,需要采取什么行动,我们使用织入规则可以将横切关注点的实现织入到核心业务逻辑中去。AspectJ编译器对包括了织入规则的模块进行编译这些模块是用来实现系统

39、中横切关注点的,它们增加了新的行为到核心模块的声明中。“织入”发生在编译器将源代码和方面解释为字节码的阶段。2.3.2 连接点AspectJ中,连接点是最基本的概念,一个连接点可以是系统中任何可识别的执行点。AspectJ中的连接点是执行横切行为的地方,因此连接点对于pointcut和advice是很重要的。所有的连接点都有一定的上下文和它们联系。例如,对一个方法调用连接点就包括当前对象、目标对象和方法所使用的参数作为上下文:类似地,异常处理连接点将以当前的对象和抛出的异常作为上下文,这些上下文信息可以被切入点以特定的形式捕获到,以供通知体使用。AspectJ中常用的几类连接点有:(1) 方法

40、的调用执行连接点。方法执行连接点是基于方法体本身的,而方法调用连接点则是基于程序的其他部分来说的,方法调用连接点的位置通常是调用方法的语法构造之处。(2) 构造器的调用执行连接点。构造 器 连 接点和方法连接点很相似,不过它表示的是一个对象创建逻辑的执行和调用。构造器执行连接点就是构造函数执行的本身,封装了一个对象被创建时构造函数体内所有代码的执行。而构造器调用连接点则是对象创建逻辑被调用的地力一。是创建一个新对象时的位置。(3) 异常处理执行连接点。异常 处 理 执行连接点表示的是一个异常类型的处理位置。这类连接点与捕获异常的catch块密切相关,(4) 属性的读写访问连接点。属性访问连接点

41、捕获一个类的实例或类成员的读写访问权限。需要注意的是,AspectJ中只有在访问类或方面的数据成员时,此类连接点才是可用的,也就是说,对于方法中定义的变量访问不能作为可用的连接点。(5) 通知执行连接点。通 知执 行 连接点包含了系统中每个通知的执行内容。此类连接点可以通知另一个advice对该advice本身进行动态横切。除以上介绍的连接点外,在AspectJ的连接点范畴中还有类初始化连接点、对象初始化连接点和对象预初始化连接点,每一类连接点都对应程序中特定的执行位置。2.3.3切入点切入点用来捕获或识别程序流中的连接点。一旦切入点捕获了匹配的连接点,就可以在相应的连接点位置执行某种行为操作

42、。除匹配程序中的连接点,某些切入点还可以捕获所匹配连接点处的上下文信息,这些信息可以为通知提供服务。切入点可以被定义在类、接口或者方面中。切入点可以被定义为命名的,也可以是匿名的。匿名切入点就像匿名类一样,被定义在使用的地方;命名切入点一旦被定义,则可以在多个地方被使用。命名切入点的语法结构如下所示:access specifierpointcutpointcut-name(args):pointcut-definitionaccess specifier是访问权限说明,可以是public.p rivate或protected的;pointcut是切入点定义的关键字;pointcut-name

43、是该切入点的名字;args是该切入点所捕获的参数;冒号的右边说明了该切入点捕获程序中什么样的连接点;通知将根据切入点所捕获到的连接点执行某种行为操作。看一个具体的切入点的定义:public pointcut accountOperationso:call(*A ccount.*(.),这个切入点定义了捕获调用Account类中所有方法的连接点。通知中可以使用这个命名的连接点。例如:before( ):ac countOperationsQ- . 通知体匿名切入点是由匿名表达式在切入点使用的位置来声明切入点定义的。由于匿名切入点只能在定义的位置引用,因此它不能够被重用。下面的代码是一个引用匿名切

44、入点的例子,它的功能和上述命名切入点所实现的功能是一致的:beforeo : call(*A ccount.*(.). .通知体匿名切入点和命名切入点可以联合起来声明一类切入点,例如下面的代码,该切入点将命名切入点accountOperationo限制在匿名切入点声明的within(banking.*) 中。pointcutinternalAccountOperationso:accountOperation()&within(banking.*);无论是命名切入点还是匿名切入点,它们在应用中所体现的功能是一致的,即要捕获切入点定义所描述的连接点。 考虑到横切关注点被系统中多个核心模块的多处连

45、接点所引用,AspectJ通过在切入点的定义中引入“通配符”来捕获所需要的多个连接点。以下三种符号用于对连接点的识别和捕获:“*” 表示除了“.”之外任意数量的所有字符;“” 表示任意数量的字符,包括“.”;“十” 表示一个给定类型的任何子类或子接口。Aspect J中还定义了两种操作来关联简单的切入点使得它们变的更复杂。它们分别是:一元操作“!”,二元操作“&”等2.3.4 通知Advcie通知是发生在横切过程中的一组操作,它定义了程序在执行横切行为时该做什么。通知的结构和方法类似,它的执行位置由切入点所捕获的连接点来说明。AspectJ共有三种类型的通知:(1)before advice:

46、在被捕获的连接点前执行。(2)after advice:在连接点之后执行。(3)around advice:围绕着连接点执行。若在 around通知中需要执行原程序中被捕获连接点处的逻辑,则必须使用proceed()关键字。若没有使用proceed()关键字,那么原程序中被捕获连接点处的逻倒各被忽略。每个around通知必须声明一个返回类型,这个类型可以是void。声明的返回类型必须和被捕获连接点处的返回类型是一致的。例如,有一系列的方法,它们的返回类型都是char,那么捕获这些方法的around通知的返回类型必须也是char类型的。其中around通知可以绕过原来的执行,继续原来的执行或者由

47、新的内容来替代原来的执行,因此被称为围绕着连接点的执行。图 3.2 展 示了各类advice在程序执行中的位置,大括号表示around通知所作用的范围,before和after通知分别在相应的切入点捕获的连接点前后执行。图26 advice在程序中的位置advice由三部分组成,分别是:advice声明,切入点说明和通知体。如下面的例子:pointcut connectionOperation(Connectionc onnection):call(* Connection.*(.)throws SQLException)&target(connection)这个命名为connection0p

48、eration的切入点由两个匿名切入点call(*C onnection.*(.)throws SQLException)和target(connection)组成,前者捕获了调用Connection类中的所有方法的连接点,后者捕获了connection对象。在下面的advice中要用到该切入点。before(Connection connection) /advice 声 明:connection0peration(comiection) / 切入点说明System.out.println(performing operation on+conncetion); /通知体冒号前面是advice的声明部分,它说明切入点在捕获到相应的连接点时执行何种通知操作(before, after或ar

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号