基于AOP的异常处理研究与应用
2014-10-21赵文杰
摘 要:异常处理是任何软件中都必须面对的一类问题,但传统的异常处理过程会和程序中的其它代码产生了一种紧耦合关系,这种紧耦合关系使得代码的重用和维护非常困难。本文将结合面向方面编程讨论基于AOP的异常处理模型,该模型能够比较好的实现异常处理代码和业务逻辑代码的解耦,大大提高整个程序的重用性和可维护性。
关键词:异常处理;面向方面编程;AOP
中图分类号:TP311.52
对异常的处理是任何软件都必须面对的一类问題,然而传统的异常处理方式会使得负责异常处理的代码弥散在整个程序中,形成一种和其它代码的紧耦合,这种紧耦合使得程序的可维护性和可重用性非常差,同时也会干扰正常的业务逻辑,不利于异常这类问题的集中处理。本文结合目前比较流行的面向方面编程,给出一种基于AOP的集中式异常处理模型,该模型可以很好的实现异常处理和其它代码的分离解耦。这使程序员在编程之初可以更加专注于业务逻辑的处理而无须分心去处理异常,对异常的处理可以在随后进行集中化处理并通过AOP的织入功能加入到程序中来。这大大增强了整个程序的可维护性和可重用性,也使我们的程序代码看起来会更加干净、结构清晰。
1 面向方面编程
面向方面编程(Aspect Oriented Programming)是对面向对象编程的进一步补充,它可以将散布在程序中的不相关对象中的一些相同逻辑抽取出来模块化,从而进一步提高了程序的重用性和可维护性。AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑,例如:事务处理、日志管理、权限控制、异常处理、调试等模块化,以降低模块之间的耦合度,减少重复代码的出现。
1.1 AOP基本概念[1]
方面(Aspect):对横切性关注点的模块化,是我们从业务模块中抽取出来的一类相似逻辑的模块化。
连接点(Joinpoint):是横切性逻辑的触发点,可以是类的初始化、某方法的调用、特定异常的抛出。
通知(Advice):在特定的连接点,AOP框架执行的动作。通知的类型[2]包含:“around”、“before”、“after throwing”、“after returning”等,用于定义执行动作在什么时机触发。
切入点(Pointcut):一个通知被触发的一系列连接点的集合。
目标对象(Target Object):包含连接点的对象,是业务逻辑对象。
AOP代理对象(AOP Proxy):AOP框架创建目标对象的代理象,通过代理对象对目标对象的功能进行增强,将方面应用到目标对象。
织入(Weaving):AOP框架创建AOP代理对象的过程,它将我们横切性关注点融入到当前系统中,扩展系统的功能。
AOP可以降低模块的耦合度,使系统更易扩展,增强代码的复用性,还可以实现横切性问题的迟绑定。
2 基于AOP的异常处理模型
图1中给出的是一个使用AOP的异常处理模型。该异常处理模型中,Client为调用业务逻辑对象的客户端,Target为提供服务的业务逻辑对象,ExAspect为处理异常的方面(Aspect),ExceptionHandler负责在截获异常后对异常进行处理,可以是对异常情况的记录、发送通知等。在未使用AOP之前Client将会直接对Target进行调用,异常处理代码则被交织在业务逻辑代码中,而在AOP异常处理模型中,Target被一个AOP代理对象所代理,AOP代理对象在调用Target之后捕捉异常,并对捕捉到的异常进行处理,异常处理代码则被模块化入ExceptionHandler处理。这种方法实现了异常处理代码和正常业务逻辑代码的分离解耦,增强了代码的复用性和可扩展性。
下面我们以JAVA和Spring2.5为例,给出其程序代码和配置的基本实现方式。
配置中定义了切面pointcut1为com.test.service包下的所有对象方法的执行,定义了after-rhrowing类型的通知,当切面中的连接点执行并有异常抛出时会触发ExAspect中doThrowing方法的执行,在doThrowing方法中我们调用ExceptionHandler模块对异常进行处理。使用过程中AOP代理的创建则由框架完成,这个过程在AOP中叫织入(weaving)。
注意在Aspectj和Spring中after-throwing类型的通知在处理后会继续把异常向上抛,如果想对异常类型进行转换或屏蔽,则可以使用around通知类型。
3 结束语
本文研究了AOP技术在异常处理上的应用,并给出了一种实现模型。AOP技术的引入改变了传统的异常处理方式,使得异常处理代码和正常业务逻辑代码实现了解耦,增强了代码的复用性、可维护性、及程序可扩展性,AOP技术的引入还使得我们可以做到异常处理代码的延长实现,这样在前期可以不用过多的考虑异常处理的问题,从而可以把主要精力集中在业务逻辑的实现上。
参考文献:
[1]Rod Johnson. Spring2.5参考手册.译者:丁雪丰等,译.Spring中文论坛,2008:105-149.
[2]The AspectJTM Programming Guide[EB/OL].http://www.eclipse.org/aspectj/doc/released/progguide/index.html,2003/2015.1
作者简介:赵文杰(1979-),男,河南安阳人,汉族,助理工程师,硕士研究生,研究方向:软件工程。
作者单位:濮阳市安阳地区医院 计算机中心,河南安阳 455000