面向方面的程序设计_第1页
面向方面的程序设计_第2页
面向方面的程序设计_第3页
面向方面的程序设计_第4页
面向方面的程序设计_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1面向方面的程序设计面向方面的程序设计兼谈计算科学的创新兼谈计算科学的创新2面向方面的程序设计面向方面的程序设计nAspect oriented programming(AOP)3n Xerox(施乐施乐)公司公司PARC研究中心在研究中心在19971997年的欧洲年的欧洲面向对象编程大会(面向对象编程大会(ECOOP97ECOOP97)上首次提出)上首次提出Aspect-Aspect-oriented programmingoriented programming(AOPAOP)。n 自自20022002年起,每年分别在欧洲和美国轮流召开专门年起,每年分别在欧洲和美国轮流召开专门的面向方面软

2、件开发(的面向方面软件开发(AOSDAOSD)国际会议。与会者包括)国际会议。与会者包括美国、加拿大、荷兰、英国、法国、丹麦、日本、以美国、加拿大、荷兰、英国、法国、丹麦、日本、以色列等。我国一些学校也对色列等。我国一些学校也对AOPAOP给以关注并开展了一些给以关注并开展了一些研究工作。研究工作。n 从从AOP概念提出经过了近十年的时间,这种技术概念提出经过了近十年的时间,这种技术现在已经开始被工业界采用。现在已经开始被工业界采用。 4AOPAOP产生的背景产生的背景 计算机软件设计的一个重要原则,就是要清计算机软件设计的一个重要原则,就是要清晰晰分离各种关注点分离各种关注点(separat

3、ion of concerns),然),然后分而治之,各个击破,最后形成统一的解决方案。后分而治之,各个击破,最后形成统一的解决方案。业务逻辑存储日志安全需求关注点标识5 关注点:是指一个特定的目标、概念或者兴趣域。关注点:是指一个特定的目标、概念或者兴趣域。n从技术的角度,软件系统分别包括从技术的角度,软件系统分别包括核心级和系统级核心级和系统级的关的关注点。注点。n核心级关注点是系统要完成的核心级关注点是系统要完成的业务功能业务功能;n系统级关注点是完成核心级关注点所必须的系统级关注点是完成核心级关注点所必须的配套设施配套设施,这,这些配套设施通常被认为是整个系统的系统特性,或者是业些配套

4、设施通常被认为是整个系统的系统特性,或者是业务功能的功能约束。务功能的功能约束。例如:信用卡处理系统例如:信用卡处理系统 核心关注点是核心关注点是处理付款处理付款; 系统级关注点包括系统级关注点包括日志、事务、认证、安全和性日志、事务、认证、安全和性能能等等。等等。6n软件系统中,某个行为,例如操作日志的软件系统中,某个行为,例如操作日志的记录,存在于软件的各个部分中,这个行记录,存在于软件的各个部分中,这个行为可以看作是横向存在于软件之中,他所为可以看作是横向存在于软件之中,他所关注的是软件的各个部分的一些共有的行关注的是软件的各个部分的一些共有的行为。为。n在很多情况下,这种行为不属于业务

5、逻辑在很多情况下,这种行为不属于业务逻辑的一部分。这种操作并不是业务逻辑调用的一部分。这种操作并不是业务逻辑调用的必须部分,但是,我们却往往不得在代的必须部分,但是,我们却往往不得在代码中显式进行调用,并承担由此带来的后码中显式进行调用,并承担由此带来的后果。果。7n在目前的技术框架下,通常在目前的技术框架下,通常系统级关注点在系统级关注点在逻辑上逻辑上相互之相互之间间彼此正交(相互独立),彼此正交(相互独立),同时在同时在实现上实现上趋向于趋向于和若干核和若干核心模块交织心模块交织。 例如:信用卡管理系统的每个核心业务关注点都和安全、例如:信用卡管理系统的每个核心业务关注点都和安全、日志等系

6、统关注点相联系。日志等系统关注点相联系。8n核心级关注点核心级关注点(业务)多数情况下可以(业务)多数情况下可以被很好地分解,并被很好地分解,并通过编程语言模块化通过编程语言模块化实现(子模块或软构件)实现(子模块或软构件)。n系统级关注点系统级关注点(横向关注点),使用当(横向关注点),使用当前的程序设计方法导致前的程序设计方法导致在许多构件中要在许多构件中要重复包含(扩散)这些代码重复包含(扩散)这些代码。9横切示例(crosscutting)nAuthentication 权限权限nCaching 缓存缓存nContext passing 内容传递内容传递nError handling

7、错误处理错误处理nLazy loading 懒加载懒加载nDebugging 调试调试nLogging、tracing、profiling and monitoring 日志、跟踪、日志、跟踪、优化、校准优化、校准nPerformance optimization 性能优化性能优化nPersistence 持久化持久化nResource pooling 资源池资源池nSynchronization 同步同步nTransactions 事务事务10现有软件技术的不足 目前的实现技术只提供了一维方法学实现系统的关注点,该单一维度一般是核心需求和关注点的模块化实现,其他类型的需求也被迫和该主导维度一

8、致。安安全全事事务务业业务务业务主导维业务主导维 问题空间是问题空间是n n维的,而解空间是一维的。这种失配必然导致需求和维的,而解空间是一维的。这种失配必然导致需求和实现之间的失配。实现之间的失配。11源程序就会变成一些为不同关注目的而编制的源程序就会变成一些为不同关注目的而编制的指令的缠结混乱物。指令的缠结混乱物。缠结现象缠结现象是现有软件系统中许多不必要的是现有软件系统中许多不必要的复杂性的核心复杂性的核心。它增加了功能构件之间的依赖性,它增加了功能构件之间的依赖性,分散了构件原来假定要做的事情,分散了构件原来假定要做的事情,提供了许多程序设计出错的机会,提供了许多程序设计出错的机会,使

9、得一些功能构件难以复用,使得一些功能构件难以复用,源代码难以开发、理解和发展。源代码难以开发、理解和发展。12v某一应用的领域专家,不太可能对分布、认证、某一应用的领域专家,不太可能对分布、认证、访问控制、同步、加密、冗余等问题的复杂实访问控制、同步、加密、冗余等问题的复杂实现机制很熟悉,所以就不能保证他们在程序中现机制很熟悉,所以就不能保证他们在程序中进行正确的调用。进行正确的调用。v开发人员很难正确预见到未来对程序的新需求开发人员很难正确预见到未来对程序的新需求。13方面(Aspect)n设计上讲,是横切系统的一些软件系统级关注点。设计上讲,是横切系统的一些软件系统级关注点。n实现上讲,它

10、支持将横切系统的关注点封装在单独的模块单实现上讲,它支持将横切系统的关注点封装在单独的模块单位中,它是位中,它是AOP将横切关注点局部化和模块化的实现机制。将横切关注点局部化和模块化的实现机制。n常见的常见的“方面方面”:异常和出错处理异常和出错处理同步和并发控制同步和并发控制 内存访问模式内存访问模式日志、安全日志、安全事务、性能事务、性能14 AOP AOP核心内容就是所谓的核心内容就是所谓的“横切关注点横切关注点”,即,即“方面方面”,AspectAspect是是AOPAOP提供的一种程序设计单元。提供的一种程序设计单元。而在而在OOP中中,这些一般关注点的实现单元叫作类这些一般关注点的

11、实现单元叫作类 AOPAOP的目标,是要将这些横切关注点与业务逻的目标,是要将这些横切关注点与业务逻辑代码相分离,从而得到更好的软件结构、性能以辑代码相分离,从而得到更好的软件结构、性能以及稳定性等方面的好处。及稳定性等方面的好处。 AOPAOP被认为是后面向对象时代的一种新的重要被认为是后面向对象时代的一种新的重要的程序设计技术。的程序设计技术。15AOP的基本思想n通过分别描述系统的不同关注点及其关系,以一种松耦合的方通过分别描述系统的不同关注点及其关系,以一种松耦合的方式实现单个关注点,然后依靠式实现单个关注点,然后依靠AOP环境的支撑机制,将这些关环境的支撑机制,将这些关注点组织或编排

12、成最终的可运行程序。注点组织或编排成最终的可运行程序。 普通关注点可以使用传统的结构化方法和面向对象方法体统的机普通关注点可以使用传统的结构化方法和面向对象方法体统的机制。制。 系统关注点使用系统关注点使用Aspect机制。机制。16AOP程序设计的一般步骤n一、一、对需求规约进行对需求规约进行Aspect分解。分解。n确定哪些功能是组件必须实现的,即提取出确定哪些功能是组件必须实现的,即提取出核心核心关注点。关注点。n哪些功能可以以哪些功能可以以aspect的形式动态加入到系统组的形式动态加入到系统组件中去,即提取出系统级的件中去,即提取出系统级的横切关注点横切关注点。17AOP程序设计的一

13、般步骤n二、二、对标识出的对标识出的Aspect分别通过程序机制实现。分别通过程序机制实现。 构造系统的组件。构造系统的组件。 利用利用组件语言组件语言实现系统的组件。对于实现系统的组件。对于OOP语言,这些组件可以是语言,这些组件可以是类;对于过程化程序设计语言,这些组件可以是各种函数和类;对于过程化程序设计语言,这些组件可以是各种函数和API。 构造系统的构造系统的aspect。 利用一种或多种利用一种或多种aspect语言语言实现实现aspect。 aspect语言必须提供声明语言必须提供声明aspect的机制。的机制。aspect如何声明如何声明连接点如何定义连接点如何定义aspect

14、代码如何定义代码如何定义aspect的参数化程度等的参数化程度等18n三、三、用用aspect编织器将所有的单元编排重组在一起,形成最终的可运行编织器将所有的单元编排重组在一起,形成最终的可运行系统。系统。 为组件语言和为组件语言和aspect语言构造相应的语法树;依据语言构造相应的语法树;依据aspect中的连接点中的连接点定义对语法树进行联结;在连接的语法树上生成中间文件或目标代码。定义对语法树进行联结;在连接的语法树上生成中间文件或目标代码。 aspect语言必须提供将语言必须提供将aspect代码和基础代码组合编排(代码和基础代码组合编排(weaving)在一起的机制。在一起的机制。定

15、义编排语言和规则。定义编排语言和规则。解决解决aspect之间潜在的冲突。之间潜在的冲突。为组装和执行建立外部约束。为组装和执行建立外部约束。 aspect语言必须提供生成可运行系统的实现机制。语言必须提供生成可运行系统的实现机制。系统的组合是在编译时静态组装还是运行时动态进行。系统的组合是在编译时静态组装还是运行时动态进行。对程序单元分别进行编译的模块化编译机制。对程序单元分别进行编译的模块化编译机制。对组装结果的验证机制等。对组装结果的验证机制等。19AOP的本质n 将横切关注点(如日志、权限验证、并发控制等非功能需将横切关注点(如日志、权限验证、并发控制等非功能需求)单独用求)单独用as

16、pect实现,而业务功能用现有的软件技术实实现,而业务功能用现有的软件技术实现。由现。由AOP机制提供将这些分离的关注点编织为一个可执行机制提供将这些分离的关注点编织为一个可执行程序。程序。n提高代码的可理解性、可维护性、可复用性等。提高代码的可理解性、可维护性、可复用性等。横切关注点横切关注点20AOP系统的软件开发过程业务逻辑存储日志安全需求关注点标识编织器Aspect分解Aspect重组21AOP与OOP比较OOP是是AOP的技术基础,的技术基础,AOP是对是对OOP的继承和发的继承和发展。展。n可扩展性:可扩展性: 指软件系统在需求更改时程序的易更改能力。指软件系统在需求更改时程序的易

17、更改能力。 OOP主要通过提供继承和重载机制来提高软件的主要通过提供继承和重载机制来提高软件的可扩展性。可扩展性。 AOP通过扩展通过扩展Aspect或增加或增加Aspect,系统相关的,系统相关的各个部分都随之产生变化。各个部分都随之产生变化。22n可重用性:可重用性: 指某个应用系统中的元素被应用到其他应用系统的能指某个应用系统中的元素被应用到其他应用系统的能力。力。 OOP以类机制作为一种抽象的数据类型,提供了比过以类机制作为一种抽象的数据类型,提供了比过程化更好的重用性。程化更好的重用性。nOOP的重用性对非特定于系统的功能模块有很好的支持,的重用性对非特定于系统的功能模块有很好的支持

18、,如堆栈的操作和窗口机制的实现。如堆栈的操作和窗口机制的实现。n对于不能封装成类的元素,如异常处理等,很难实现重对于不能封装成类的元素,如异常处理等,很难实现重用。用。AOP使不能封装成类的元素的重用成为可能。使不能封装成类的元素的重用成为可能。23n易理解性和易维护性易理解性和易维护性n代码缠结问题的存在,使代码缠结问题的存在,使OOP技术在易理解性和易维护技术在易理解性和易维护性方面都难有很大的提高。性方面都难有很大的提高。n统计发现:统计发现:“如果一个他人写的程序有如果一个他人写的程序有37处需要改动,处需要改动,对于一个最优秀的软件开发人员,也大概只能找到对于一个最优秀的软件开发人员

19、,也大概只能找到35个个”。n对于对于AOP,对一个,对一个Aspect修改可以通过联结器影响到修改可以通过联结器影响到系统相关的各个部分,从而大大提高系统的易维护性。系统相关的各个部分,从而大大提高系统的易维护性。24AOP特性nAspect的实现和传统开发方法中的实现和传统开发方法中模块的实现不同模块的实现不同。 Aspect的开发彼此独立,是一种松耦合关系。的开发彼此独立,是一种松耦合关系。 主代码的开发者甚至可能没有意识到主代码的开发者甚至可能没有意识到aspect的存在。的存在。只是在最后系统组装时,才将各只是在最后系统组装时,才将各aspect代码和主代码代码和主代码编排融合在一起

20、。编排融合在一起。主代码和主代码和AspectAspect之间采用之间采用“隐式调用隐式调用”。v 某一应用的领域专家,不太可能对分布、认证、访问控制、同步、某一应用的领域专家,不太可能对分布、认证、访问控制、同步、加密、冗余等问题的复杂实现机制很熟悉,所以就不能保证他们加密、冗余等问题的复杂实现机制很熟悉,所以就不能保证他们在程序中进行正确的调用。在程序中进行正确的调用。v 开发人员很难正确预见到未来对程序的新需求。开发人员很难正确预见到未来对程序的新需求。25AspectJnAspectJ是是Xerox PARC开发的基于开发的基于Java语言语言的的AOP扩展,它既是一种规约语言,也是一

21、扩展,它既是一种规约语言,也是一种种AOP的实现语言。的实现语言。nAspectJ是一种支持是一种支持“面向面向Aspect”概念的语言。概念的语言。26AspectJnAspectJ提供了支持提供了支持“面向面向Aspect”概念的如下语言结构及定概念的如下语言结构及定义:义: Joinpoints:预定义好的程序的特定执行点。:预定义好的程序的特定执行点。例如:例如: 方法的调用和执行方法的调用和执行 对属性的读写访问对属性的读写访问 异常处理异常处理 对象和类的初始化执行对象和类的初始化执行 构造器的调用和执行构造器的调用和执行27 Pointcuts:用来指明所需连接点的语言元素用来指

22、明所需连接点的语言元素。可能包括一系可能包括一系列的连接点列的连接点,同时它还可以为在连接点上执行的通知提供上同时它还可以为在连接点上执行的通知提供上下文下文。例如:例如: pointcut callSetter( ); call (public void HelloWorld.set*(.)。 其中:其中: pointcut说明声明的是一个切入点,命名说明声明的是一个切入点,命名 callSetter,后面的,后面的空括号表示该切入点不需要上下文信息。空括号表示该切入点不需要上下文信息。 Call表示该切入点捕获的是对指定方法的调用,指定的方法是表示该切入点捕获的是对指定方法的调用,指定的方

23、法是在类在类HelloWorld中声明的共有的、返回值为空、以中声明的共有的、返回值为空、以set开头、开头、拥有任意参数的方法。拥有任意参数的方法。28 Advices:要在:要在Pointcuts执行的执行的Aspect的代码。的代码。 AspectJ提供了提供了3种把通知关联到连接点的方式:种把通知关联到连接点的方式:after、before、around。 after和和before分别表示通知在连接分别表示通知在连接点的前面或者后面运行,点的前面或者后面运行,around则表示通知在连接点则表示通知在连接点的外面运行,并可以决定是否运行此连接点。的外面运行,并可以决定是否运行此连接点

24、。 例如:例如: 在银行信息系统中,实现帐户存取模块、权限验证模在银行信息系统中,实现帐户存取模块、权限验证模块和日志记录模块。帐户存取模块可用块和日志记录模块。帐户存取模块可用OOP技术来实技术来实现,其他的模块可采用现,其他的模块可采用AOP技术。技术。 在在around通知中验证权限,只有验证通过才运行该连通知中验证权限,只有验证通过才运行该连接点,在接点,在before和和after通知中就输出日志记录。通知中就输出日志记录。 Aspect:上述三者的结合。以类似于类的概念,将:上述三者的结合。以类似于类的概念,将Pointcut和和Advice组合在一起,形成一个程序单元。组合在一起

25、,形成一个程序单元。29nAspectJ为程序员提供了编译、调试等工具。为程序员提供了编译、调试等工具。nAspect编排器编排器n将不同将不同aspect组装到一起。组装到一起。nAspect调试器调试器n独立的独立的Aspect浏览器浏览器n和一些流行的和一些流行的IDE环境(环境( Forte 、 Jbuilder 、 Emacs )的集成。)的集成。nAspectJ可以引入新的数据成员和新的方法。可以引入新的数据成员和新的方法。30应用示例应用示例1:1:一个简单的使用面向对象方法设计的图元编辑器的示例。在该图元编辑器在该图元编辑器中,抽象图元类中,抽象图元类FigureElement

26、有有两个图元子类两个图元子类Point和和Line,分,分别对点和线进行别对点和线进行管理。这两个类管理。这两个类体现了良好的模体现了良好的模块性,类中源代块性,类中源代码都紧密相关,码都紧密相关,内聚度很高,并内聚度很高,并且每个类的接口且每个类的接口都很清晰都很清晰。显示更新的需求:显示更新的需求:无论图元何时移动、无论图元何时移动、移动到哪里,都要移动到哪里,都要通知屏幕管理器通知屏幕管理器(Display)其位)其位置发生了改变。置发生了改变。31 采用面向对象的设计方法,典型的做法是在每个移动图采用面向对象的设计方法,典型的做法是在每个移动图元的操作代码中,都插入一段通知元的操作代码

27、中,都插入一段通知Display其位置发生了改变其位置发生了改变的代码(调用的代码(调用Display.update( )方法),如图所示。方法),如图所示。Class Line private Point _p1,_p2; Point getP1( ) return _p1; Point getP2( ) return _p2; void setP1(Point p1)this._p1=p1; Display.update( ); void setP2(Point p2)this._p2=p2; Display.update( ); Class Point private int _x1,_

28、x2; int getX( ) return _x1; int getY( ) return _x2; void setX (int x1)this._x1=x1; Display.update( ); void setY(int x2)this._x2=x2; Display.update( ); 32Aspect DisplayUpdatingPointcut move(): call(void Line.setP1(Point)| call(void Line.setP2(Point)| call(void Point.setX(int)| call(void Point.setY(in

29、t); after() returning:move()Display.update(); Class Line private Point _p1,_p2; Point getP1( ) return _p1; Point getP2( ) return _p2; void setP1(Point p1)this._p1=p1; void setP2(Point p2)this._p2=p2; Class Point private int _x1,_x2; int getX( ) return _x1; int getY( ) return _x2; void setX (int x1)t

30、his._x1=x1; void setY(int x2)this._x2=x2; 33假设我们想用假设我们想用aspect做以下的事情:做以下的事情:n在任何对象调用在任何对象调用TestClass.sayHello()方法的前后打印一条消方法的前后打印一条消息。息。n测试测试TestClass.sayAnyThing()方法的参数至少有三个字符。方法的参数至少有三个字符。public class TestClasspublic void sayHello()System.out.println(“Hello,AOP”);public void SayAnyThing(String s)sy

31、stem.out.println(s);)public static void main(String args)TestClass t=newTestClass();t.sayHello();t.sayAnyThing(“ok”); 应用234public aspect MyAspectpublic pointcut sayMethodCall(): call(public void TestClass.say*();pub1ic pointcut sayMethodCal1Arg(String str): call(public void TestClass.sayAnyThing (st

32、ring)&args(str);before():sayMethodCal1() System.out.print1n(“nTestClass.”+ thisJoinPointStaticPart.getSignature().getName()+”start”);after():sayMethodCal1() System.out.print1n(“nTestClass.”+ thisJoinPointStaticPart.getSignature().getName()+”end”);before(String str):sayMethodCallArg(str) if(str.1engt

33、h() 3) System.out.println(“Error:I cant say words less than 3 characters”); return; 35应用示例应用示例3 3:例外处理:例外处理 以数据库查询为例,分别用以数据库查询为例,分别用OOP的的Java语言语言和和AOPAOP的的AspectJAspectJ语言加以语言加以 实现。实现。public class DBQuery public ResultSet executeQuery(String sql)try/ 数据库连接操作数据库连接操作/ 数据库查询操作数据库查询操作catch(java.lang.Cla

34、ssNotFoundException e)/对对ClassNotFound 例外进行处理例外进行处理catch(SQLException e)/ 对对SQL例外进行处理例外进行处理catch(Exception e)/ 对其他例外进行处理对其他例外进行处理36分析以上代码,主要存在以下几点不足:分析以上代码,主要存在以下几点不足:n要求编程人员掌握大量的例外类库和复杂的语法结构,要求编程人员掌握大量的例外类库和复杂的语法结构,实际应用中容易出错;实际应用中容易出错;n对例外的处理并不是对例外的处理并不是DBQuery类的核心功能,但编程类的核心功能,但编程人员要花费大量精力在例外的处理上,而

35、忽略了问题人员要花费大量精力在例外的处理上,而忽略了问题本身;本身;n当当DBQuery所在类包中定义了多个类或所在类包中定义了多个类或DBQuery中中定义了多个方法时定义了多个方法时( (如数据库记录的添加、更新、删除如数据库记录的添加、更新、删除等操作),就要重复定义多个相同的例外处理;等操作),就要重复定义多个相同的例外处理;n大量的例外处理代码可能引起更多的不必要错误,给大量的例外处理代码可能引起更多的不必要错误,给程序调试和维护带来了困难;程序调试和维护带来了困难;基于以上几点,可认为它是有安全隐患和不健壮的程序。基于以上几点,可认为它是有安全隐患和不健壮的程序。37 基于基于AO

36、P 安全编程的思想,在安全编程的思想,在DBQuery类类中保留单纯的数据库连接和查询代码,而将其中保留单纯的数据库连接和查询代码,而将其中实现例外处理的代码抽取出来,组织成单独中实现例外处理的代码抽取出来,组织成单独模块。模块。 38aspect ExHandledeclare soft: Exception : within(DBQuery);pointcut Callmethod(DBQuery query):this(query)& call(* * DBQuery.*(.) ;after (DBQuery query) throwing (java.lang.ClassNotFoun

37、dException e): Callmethod(query) /对对ClassNotFound 例外进行处理例外进行处理after (DBQuery query) throwing (SQLException e ): Callmethod(query) /对对SQL例外进行处理例外进行处理 after (DBQuery query) throwing (Exception e ): Callmethod(query) /对其它对其它例外进行处理例外进行处理39 以下几方面为突出的安全优点:以下几方面为突出的安全优点:n程序开发人员可专注于数据库连接和查询操作本身,程序开发人员可专注于数据

38、库连接和查询操作本身,而无须同时考虑对例外的处理;而无须同时考虑对例外的处理;n安全代码被独立到单独的安全代码被独立到单独的aspect 中,使程序更易理解,中,使程序更易理解,且当安全策略需要修改时,只需变动且当安全策略需要修改时,只需变动ExHandle 代码,代码,而无需改动而无需改动DBQuery 类;类;n当添加新的类或当添加新的类或DBQuery类中添加新的方法时,编程类中添加新的方法时,编程人员不必考虑新的错误处理策略,甚至不必去了解这人员不必考虑新的错误处理策略,甚至不必去了解这些策略,些策略, ExHandle代码将自动应用于它们。代码将自动应用于它们。40应用应用4 4:一

39、个异常处理的实例:一个异常处理的实例 下面的代码是一个简单的方面的例子,它打印所下面的代码是一个简单的方面的例子,它打印所有的没有被包中定义的任何方法处理的异常。我们能有的没有被包中定义的任何方法处理的异常。我们能在测试时使用这个代码,看是否有没预料到的错误,在测试时使用这个代码,看是否有没预料到的错误,由此指出包中的一个漏洞。由此指出包中的一个漏洞。public aspect ExceptionPrinterpointcut allMethods( ):executions(* *();static after( ) throwing (Exception e):allMethods( )S

40、ystem.out.println(“Uncaught exception:”+ e);41应用5:AOP技术在并发访问控制中的应用n当多个线程要访问同一个变量或对象时,为了保证数当多个线程要访问同一个变量或对象时,为了保证数据的一致性,要实施一些并发访问控制策略。据的一致性,要实施一些并发访问控制策略。n通常的做法是采用加锁和解锁的方法。即多个访问类通常的做法是采用加锁和解锁的方法。即多个访问类同时访问一个共享数据对象时,每个访问类在访问这同时访问一个共享数据对象时,每个访问类在访问这个数据对象时,将数据对象上锁,访问完成后,再解个数据对象时,将数据对象上锁,访问完成后,再解锁,供其他并发线

41、程访问。锁,供其他并发线程访问。workerAnotherworker数据对象数据对象上锁上锁解锁解锁上锁上锁解锁解锁42public aspect LockReentrantWriterPreferenceReadWriteLock rwl = new ReentrantWriterPreferenceReadWriteLock();public pointcut writeOperations( ): execution(public boolean Worker.createData( )| execution(public boolean Worker.updateData( ) |

42、execution(public boolean AnotherWorker.updateData( );before( ): writeOperations( )rwl.writeLock( ).acquire( );/在写操作之前上锁在写操作之前上锁after( ): writeOperations( )rwl.writeLock( ).release( );/在写操作之后解锁在写操作之后解锁43AOPAOP研究内容研究内容nEarly aspects: aspect-oriented requirements engineering and architecture design.nAs

43、pect-oriented modeling and designnDesign patterns for aspect-oriented systemsn 44nAspect-oriented programming languages, platforms and frameworksnType systems for aspectsnComposition models and operators for aspectsnOptimization and performance improvement of aspect-oriented composition45nApplicatio

44、n of AOSD in specific areas such as embedded systems, banking systems, ambient computing, etc.nAspects in feature-oriented approaches and product lines.nAspects in reengineering46小结小结nAOP起源于程序设计中起源于程序设计中“横切横切”引发的引发的“代码散布代码散布”和和“代码交织代码交织”问题。在目前的程序设计技术下,程问题。在目前的程序设计技术下,程序中的横切无法避免,其实现代码相互纠缠在一起,序中的横切无法避免,其实现代码相互纠缠在一起,是软件复杂度的来源之一。是软件复杂度的来源之一。nAOP就是要能分离出那些隐含的、相互交织纠缠的系就是要能分离出那些隐含的、相互交织纠缠的系统关注点,并使之明确。使用统关注点

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论