基于面向方面编程技术(AOP)在信息系统中的研究与实践
2016-03-12廖跃钧
廖跃钧
摘 要:目前传统的程序设计——面向对象编程(Object-Oriented Programming,OOP)已经成为业界的主流,是大多数软件项目开发的首选技术。当用OOP对公共行为进行建模时,它展示出强大的功能,但它在解决横跨多个模块的行为时,如在处理一些关注点分散问题存在着一定的局限性,甚至会使整个项目开发出现混乱不清的局面。在这里将共同探讨面向方面编程技术(AOP)的思想,基本概念和原理,并通过具体的例子简单介绍了面向方面编程技术(AOP)在信息系统中的研究与实践。
关键词:面向方面编程 信息系统 程序设计
中图分类号:TP31 文献标识码:A 文章编号:1672-3791(2015)08(c)-0006-04
Research and Practice of Information System Based on Aspect-oriented Programming (AOP) Technology
Liao Yuejun
(Guangdong Medical College,Dongguan,Guangdong Province, 523808 China)
Abstract:The traditional Programming,Object Oriented Programming(Object-oriented Programming,OOP) has become the mainstream of the industry,is the first choice for most software project development technology.When using OOP to public behavior modeling,it shows powerful features,but it in solving behavior across multiple modules,such as in dealing with some scattered focus there is certain limitation,even can cause a confusion of the whole project development situation.Here we discuss the thought of aspect-oriented programming(AOP)technology,the basic concept and principle,and through the concrete example simple aspect-oriented programming(AOP)technology is introduced in the research and practice of information system.
Key Words:Aspect-Oriented Programming;Information system;Program design
从上世纪九十年代至今,Object-Oriented Programming(OOP)都是主流的程序编程设计方式。面向对象技术思想的出现改变了大家程序设计的思路,大大地提高了软件生产效率。并且面向对象技术符合大家对事物认识的思维习惯,它早已被证明是一种行之有效的软件开发方法。面向对象编程技术思想是将世界上的万事万物都视为对象,在编程世界里将所有的数据和对数据的操作联系在一起,把他们当作捆绑在一起的整体——对象。然后再把那些有共同属性和行为的对象,进行归类,对于同一类的对象经过抽象后,称之为类,因此类就是描述相同类型的对象集合,定义好类后,我们又通过类来产生有着共同数据属性和相同行为的新对象,故对象是无穷无尽的,一切事物皆对象。面向对象编程就是定义各组相同类型对象的集合——类,再由类来生成对象,对象和对象之间再进行通信。这就是面向对象编程的技术思想,尽管利用面向对象编程的技术思想,可以建立对象模型与现实世界的系统模型的匹配,但是在实际的软件项目中,却仍然存在一些对象方法很难解决的问题。如在解决横跨多个模块的行为时,如在处理一些关注点分散问题存在着一定的局限性甚至会使整个项目开发出现混乱不清的局面。AOP已被证实是一种有效地简化软件系统复杂度的方法。它的主要思想来源于软件设计中关注点的分离。
1 AOP的基本原理
1.1 概念
由于AOP的应用程序结构与传统高级语言的应用程序结构基本类似,传统的高级语言系统实现由以下三部分组成:编程语言;编译器;项目开发的应用程序,故AOP的系统实现也有以上三个相应部分:语言;联结器,核心级模块。所谓的面向切面编程(AOP)其实是对业务逻辑又进行了进一步的抽取,将多种业务逻辑中的公用部分抽取出来做成一种服务(比如日志记录,性能统计,安全验证等),从而实现程序代码的重用。另外这种服务通过配置,可以动态的给程序添加统一控制,利用AOP可以对业务逻辑的各个部分进行分离,从而使得业务逻辑各部分之间的耦合度降低。那么要进一步了解AOP的的基本原理,首先要弄清楚这几个概念具体指的是什么。
(1)Aspect(方面):对横切关注点的模块化,通知和切入点的组合被称之为方面,故方面是用来定义一段程序中所包括的逻辑,以及安排何时执行这个逻辑。
(2)Advice(通知):在某一个特定的联结点处运行的代码称为“通知”,是要切入的逻辑,对横切关注点的具体实现,有分类的概念。通知有很多种,比如在Before Advice 在方法前切入;After Advice 在方法后切入;抛出异常时也会切入:After Returning Advice 在方法返回后切入,抛出异常则不会切入;After Throwing Advice 在方法抛出异常时切入。Around Advice 在方法执行前后切入,可以中断或忽略原有流程的执行
(3)Pointcut(切入点) :一个切入点是用来定义某一个通知该何时执行的一组联结点,定义了Advice(通知)应用到哪些JoinPoint(联结点)上,对Spring来说就是函数调用。Joinpoint的表达式,表示拦截哪些方法。一个Pointcut对应多个Joinpoint。
(4)JointPoint(连接点):一个程序执行过程中的连接点,如某个业务方法,。典型的拦截点就是调用一个函数;它用来定义在程序的哪里通过AOP加入新的逻辑。
(5)Target Object Advice(被应用的目标对象):如果一个对象的执行过程受到某一个AOP的应用,那么它就叫一个被应用的目标对象。目标对象通常也称为被通知对象。
(6)Weaving(织入):织入是将方面真正加入程序代码的过程。
(7)Introduction(引入):可以动态的为类添加新的方法或属性。
他们之间的关系如图1所示。
1.2 AOP程序的设计步骤
AOP应用程序包括以下三个明显的开发步骤:
(1)将系统需求进行功能性分解,区分出核心关注点以及横切关注点;
(2)单独完成每一个关注点的编码和实现,构造核心级模块以及Aspect系统级模块;
(3)用联结器指定的重组规则,将核心级模块和aspect系统级模块进行组合,形成最终系统。
2 AOP在信息系统中的实践
为了建立松散耦合的、可扩展的信息系统,AOP应用到的横切技术,通常分为两种类型:动态横切和静态横切。动态横切就是通过切入点和连接点在一个方面中创建行为的过程,连接点可以在执行时横向地应用于现有对象。动态横切通常用于帮助向对象层次中的各种方法添加日志记录或身份认证。在很多应用场景中,动态横切技术基本上代表了AOP。动态横切技术的核心主要包括jointpoint(连接点),pointcut(切入点),advice(通知)和aspect(方面)。在前面,已经概要地介绍了这些术语分别代表的含义。接下来,将以一个具体的实例来进一步阐述它们在AOP动态横切在实际信息系统中的作用。以一个学生考试系统为例子,考虑到学生考试系统的功能,就是需要对试题进行添加、删除、修改等管理操作。也就是说,在实际的应用场景中,这些行为因为涉及到数据库的增、删、改操作,所以必须添加事务才能使操作成功。首先采用传统的OOP程序设计方法,其伪代码如下:
public class QuestionManager {
privateQuestionDaoquestionDao;
public void addQuestion(QuestionDtoquestionDto) {
Transaction t = new Transaction();
questionDao.insert(questionDto);
t.commit();
}
public void deleteQuestion(QuestionDtoquestionDto) {
Transaction t = new Transaction();
questionDao.delete(questionDto);
t.commit();
}
public void updateQuestion(QuestionDtoquestionDto){
Transaction t = new Transaction();
questionDao.update(questionDto);
t.commit();
}
}
同样的,在该考试系统中,还需要对试卷进行管理,它采用了同样的事务机制:
public class PaperManager {
privatePaperDaopaperDao;
public void addPaper(PaperDtopaperDto) {
Transaction t = new Transaction();
paperDao.insert(paperDto);
t.commit();
}
public void deletePaper(PaperDtopaperDto) {
Transaction t = new Transaction();
paperDao.delete(paperDto);
t.commit();
}
public void updatePaper(PaperDtopaperDto){
Transaction t = new Transaction();
paperDao.update(paperDto);
t.commit();
}
}
如此以来,在整个学生考试系统中,核心业务包括试题管理和试卷管理,它们都需要相同的事务管理,如图2所示:
也就是说,利用AOP技术,可以分离出系统的核心关注点和横切关注点,从横向的角度,截取业务管理行为的内部消息,以达到织入事务管理逻辑的目的。当执行addQuestion()等方法时,系统将添加事务完成添加试题功能,调用横切关注点逻辑,因此该方法即为AOP的join point。对于学生考试系统而言,每个需要事务的方法都是一个单独的join point。由于事务管理将在每个方法执行前执行,所以对于这一系列join point,只需要定义一个point cut。当系统执行到join point处时,将根据定义去查找对应的point cut,然后执行这个横切关注点需要实现的逻辑,即advice。而point cut和advice,就组合成了一个事务管理的aspect方面。
由于aspect是一个封装的对象,可以定义这样一个aspect:
private static aspect TransactionAspect{……}然后在这个aspect中定义point cut,在point cut中,定义了需要截取上下文消息的方法,例如:
privatepointcutTransactionExecution();
execution(public void QuestionManager.addQuestion(QuestionDto)) ||
execution(public void QuestionManager.deleteQuestion(QuestionDto)) ||
execution(public void QuestionManager.updateQuestion(QuestionDto)) ||
execution(public void PaperManager.addPaper(PaperDto)) ||
execution(public void PaperManager.deletePaper(PaperDto))||
execution(public void PaperManager.updatePaper(PaperDto));
由于事务管理是在试题管理方法执行之前完成,因此在before advice中,定义事务管理:
before(): transactionExecution()
{
Transaction t = new Transaction();
questionDao.insert(questionDto);
t.commit();
}
通过定义了这样一个完整的aspect,当系统调用QuestionManager或PaperManager的相关方法时,就触发了point cut,然后调用相应的advice逻辑。如此以来,QuestionManager和PaperManager模块就与事务管理模块完全解除了依赖关系,同时也消除了传统设计中不可避免的事务处理的重复代码。这对于建立一个松散耦合、可扩展的系统软件是非常有利的,同时提高了软件开发速度。
4 AOP存在的问题
大家知道AOP的横切关注点是跨越多个模块的,但目前在技术上通常只能采用一维方法学来实现,这使得从需求到实现只能沿着单一的维来映射。这个单一的维通常是核心模块级实现,其它需求则与其相互交织在一起。即需求空间是多维空间,而实现空间却是一维空间,这样的不匹配造成了从需求到实现的不统一。
采用目前的方法学来实现横切关注点已证实存在许多问题,主要有:
*代码交织(code tangling):一个软件系统的模块可能同时与数个需求交互;
*代码分散(code scattering):由于横切关注点跨越多个模块,所以与这些横切关注点相关的实现代码也跨越多个模块;
*代码重用性差:由于一个模块中包含对多个关注点的实现,使得对类似功能有需求的其它系统不能很方便地重用该模块;
难以维护和升级:由于系统横切关注点的模块性差,如果系统需要改动一个功能,则需要修改多个相应的模块才能实现,这样极易造成系统的不一致,而且还需进行大量的测试工作以确保不会引起新的Bug。
5 结语
AOP技术自从1997年正式提出以来,经过多年的发展,已取得很大的成效。目前支持面向方面编程的语言已有许多种,如AspectJ、AspectC、AspectC++、JBoss、Spring等。其中以AspectJ语言最为成熟,很多实际的工程项目已用该语言解决了大量像日志、安全、事务、策略等横切关注点问题。AOP语言的使用解除了OOP语言代码混乱、交织的局面,最大程度上实现了代码的重用,方便了软件项目的升级与维护。
参考文献
[1] 薛冰.改进AOP技术在软件开发中的应用与研究[D].大连:大连交通大学,2013.
[2] 王书怀,邢建春,李决龙,等.AOP技术在信息管理系统中的应用研究[J].计算机应用与软件,2012,29(6):189-195.
[3] 刘余和.面向Aspect技术在海关EAI中的实践与研究[D].广州:中山大学,2006.
[4] G Kiczales, J Lamping, A Mendhekar, et al. Aspect-Oriented Programming [C].In European Conference on Object-oriented Program,1997,44(2):217-235.