职友集>程序员面试题 > 请详细介绍你所了解的AOP技术

请详细介绍你所了解的AOP技术

2015-11-27 06:30:02 阅读( 94 )

1670人 收藏本页

标签:程序员面试题

  什么是AOP?

最初听到AOP这个名词,我总是错觉其与OOP是否具有孪生性?那么,所谓AOP,即面向方面编程(Aspect Oriented Programming),是否是面向对象编程的一种进化呢?关键就在于我们对“方面(Aspect)”的理解。确实,“方面”这个词语是够抽象的,简单地说,它就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

对于OOP,Bruce Eckel有一句名言,“Everything is Object.”确实,在程序的世界里,我们可以将万事万物定义为一种对象,并将这些对象的行为和属性封装起来,同时定义好对象与对象之间的关系。很显然,对于AOP而言,我们无法套用这句名言,妄言“Everything is Aspect.”实质上,AOP只是OOP的一种补充或某种改进,它转换了编程的范式和视角,关注了一直以来被OOP忽略或者说未能解决好的角落,使开发人员可以更好地将本不该彼此纠缠在一起的责任(如银行业务和事务处理)分离开来。通过面向方面的编程,可以将程序的责任分开,对象与方面互不干扰。面向方面的模块并非显式地为对象所调用,而是通过或注入或截取的方式,去获得被封装的对象内部方法间的消息,然后做出相应地处理。也许面向方面的模式破坏了对象的封装,却正其如此,方才能降低模块与模块之间的耦合度。同样地,通过对“方面”的封装,将这些通用的功能从不同的类中分离出来,使不同的模块都能共享同样的“方面”,这也极大地减少了重复代码。

如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

AOP,并不具有革命的驱动力

个人认为,AOP还谈不上是一种编程的思想,只能说是一种方法而已。溯其根源,一般认为,面向方面编程(AOP)是施乐公司帕洛阿尔托研究中心(Xerox PARC)在上世纪90年代发明的一种编程范式。它在OOP的缝隙之中,抽象出“方面”的概念,目的就是为了打破对象的封装性,以“方面”的方式对原有的模块进行重组,抽取那些与业务无关却为整个系统所通用的功能,最终封装在一起。

那么,最终封装好的这些所谓“方面”,如何被业务对象所调用呢?这就需要“方面”拥有截取封装对象消息的能力。在JAVA世界里,AOP的应用已经走向比较成熟的应用。AspectJ、Spring,在体现AOP能力上来说,已经渐趋成熟。甚至在JBOSS4.0中,已经引入了AOP框架进行开发,并在权限管理(Authentication)、错误处理(Error Handling)、事务处理(Transactions)、持久化(Persistence)等方面取得了很好的应用。在.Net平台下,对于AOP的应用似乎却走到了后面。在Microsoft 推出的.Net Framework 1.1中,并没有应用AOP,也未曾提供AOP的框架。不过.Net Framework仍然提供了实现AOP的技术可能,即通过.Net Framework的反射机制或.Net Remoting的代理机制获取元数据信息或对象内部间传递的消息。同时,我也看到开源社区中的AOP.Net项目,采用了非托管的.Net Profilling API,它采用了非托管的C++ COM组件,可以在相关事件发生时,通过.Net系统捕获其消息并发送通知。

AOP在企业应用中正逐渐体现其自身的价值。但正如其名,它的作用更多地是关注于系统的某一方面。AOP还缺乏革命的驱动力,并不足以颠覆OOP世界。我们不可能预见AOP之于OOP,象当初面向对象编程取代面向过程编程那样,具有强大至可以颠覆程序员思想的力量。而事实上,AOP从一诞生以来,就从未贴上“革命”的标签。相反,它更多地起到了推波助澜的作用,弥补着OOP的缺失,进而在OO程序设计中,扩展了一种更宽广的模式。

AOP,“设计模式”的延续

不错,AOP的目的,恰恰就是做了“设计模式”想做却一直未曾做到的功能。GOF的“设计模式”给了我们设计的典范与准则,通过最大程度的利用面向对象的特性,诸如利用继承、多态,对责任进行分离、对依赖进行倒置,面向抽象,面向接口,最终设计出灵活、可扩展、可重用的类库、组件,乃至于整个系统的架构。在设计的过程中,通过各种模式体现了对象的行为,暴露的接口,对象间关系,以及对象分别在不同层次中表现出来的形态。然而鉴于对象封装的特殊性,“设计模式”的触角始终在接口与抽象中大做文章,而对于对象内部则无能为力。

举例来说,我们需要为系统提供日志的能力。虽然我们可以通过装饰模式(Decorate Pattern),提供各种日志的组合,但不可避免的是,大量的日志对象实例代码的存在,导致了重复代码的坏味道,同时也导致了强依赖性,这并不利于模块间的解耦。如果我们通过AOP,将这些日志的功能看作是一个“方面”,然后将系统中需要日志能力的模块置于该“方面”的侦听之中,抽象出来的“方面”好像是一个容器,在其内部的世界里,不分贫富贵贱。只要执行了某种业务,这个容器就会忠实地记录这些模块间传递的消息。至于这些模块到底实现了何种业务,却并非“方面”所关注的。

前面已经叙述到,面向方面编程的价值主要体现在事务处理、日志管理、权限控制等与业务无关,却为业务模块所共同调用的逻辑或责任上,而这些所谓的“方面”,恰恰是企业应用时非常必须的。因此,与其说AOP是一种编程的技术,毋宁说AOP是一种企业的“设计模式”。它弥补了OOP之拙,却未曾也不可能超越OOP而单独存在。

Aspect-Oriented Programming(面向方面编程,AOP)正好可以解决这一问题。它允许开发者动态地修改静态的OO模型,构造出一个能够不断增长以满足新增需求的系统,就象现实世界中的对象会在其生命周期中不断改变自身,应用程序也可以在发展中拥有新的功能。AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

面向方面编程(AOP)是施乐公司帕洛阿尔托研究中心(Xerox PARC)在上世纪90年代发明的一种编程范式。但真正的发展却兴起于近几年对软件设计方兴未艾的研究。由于软件系统越来越复杂,大型的企业级应用越来越需要人们将核心业务与公共业务分离。AOP技术正是通过编写横切关注点的代码,即“方面”,分离出通用的服务以形成统一的功能架构。它能够将应用程序中的商业逻辑同对其提供支持的通用服务进行分离,使得开发人员从重复解决通用服务的劳动中解脱出来,而仅专注于企业的核心商业逻辑。因此,AOP技术也就受到越来越多的关注,而应用于各种平台下的AOP技术也应运而生。但由于AOP技术相对于成熟的OOP技术而言,在性能、稳定性、适用性等方面还有待完善,同时AOP技术也没有形成一个统一的标准,这使得AOP技术的研究更具有前沿性的探索价值。

108、请问你在项目中是否用到存储过程,并请你谈谈存储过程以及它的特点

存储过程(stored procedure)是一组为了完成特定功能的sql 语句集,经编译后存储在数据库。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 在sql server 的系列版本中存储过程分为两类:系统提供的存储过程和用户自定义存储过程。系统过程主要存储在master 数据库中并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理sql server 提供支持。通过系统存储过程,ms sql server 中的许多管理性或信息性的活动(如了解数据库对象、数据库信息)都可以被顺利有效地完成。尽管这些系统存储过程被放在master 数据库中,但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过程名前加上数据库名。而且当创建一个新数据库时,一些系统存储过程会在新数据库中被自动创建。用户自定义存储过程是由用户创建并能完成某一特定功能(如查询用户所需数据信息)的存储过程。在本章中所涉及到的存储过程主要是指用户自定义存储过程。

存储过程的优点

当利用ms sql server 创建一个应用程序时,transaction-sql 是一种主要的编程语言。若运用transaction-sql 来进行编程,有两种方法。其一是,在本地存储transaction- sql 程序,并创建应用程序向sql server 发送命令来对结果进行处理。其二是,可以把部分用transaction-sql 编写的程序作为存储过程存储在sql server 中,并创建应用程序来调用存储过程,对数据结果进行处理存储过程能够通过接收参数向调用者返回结果集,结果集的格式由调用者确定;返回状态值给调用者,指明调用是成功或是失败;包括针对数据库的操作语句,并且可以在一个存储过程中调用另一存储过程。

存储过程具有以下优点:

(1) 存储过程允许标准组件式编程

存储过程在被创建以后可以在程序中被多次调用,而不必重新编写该存储过程的sql 语句。而且数据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响(因为应用程序源代码只包含存储过程的调用语句),从而极大地提高了程序的可移植性。

(2) 存储过程能够实现较快的执行速度

如果某一操作包含大量的transaction-sql 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的执行计划。而批处理的transaction- sql 语句在每次运行时都要进行编译和优化,因此速度相对要慢一些。

(3) 存储过程能够减少网络流量

对于同一个针对数据数据库对象的操作(如查询、修改),如果这一操作所涉及到的 transaction-sql 语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,否则将是多条sql 语句,从而大大增加了网络流量,降低网络负载。

(4) 存储过程可被作为一种安全机制来充分利用

系统管理员通过对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据的访问,保证数据的安全。(我们将在14 章“sqlserver 的用户和安全性管理”中对存储过程的这一应用作更为清晰的介绍)

来自IT公司面试手册

下一篇:OOP语言技术比较:Java,C++,Object Pascal

上一篇:阐述面向接口、面向对象、面向方面编程的区别

亲~ 如果您有更好的答案 可在评论区发表您独到的见解。

您想查看更多的信息: 面试题