中文摘要

摘要:面向对象编程作为主流编程范型,在Web系统设计实现中得到了很好的应用,但同时也早已暴露出不足,针对面向对象编程思想的不足人们提出了面向方
面编程。面向方面编程很好地解决了横切关注点的问题,从一个更高的角度对系统进行了分解。本博客较深入地分析研究了面向方面编程与面向对象编程之间的关系,探讨了面向方面编程的技术实现原理,对基于面向方面需求分析、设计、开发相关理论做了进一步的探讨和研究,着重研究了面向方面编程在Web系统中的应用。

  针对Web应用系统特点,本文分析设计了一种基于MVC的多层系统架构,并着重分析了系统中具有共性的一些系统级横切关注点,对象持久化、数据库连接维护、缓存和权限认证,及它们与Web系统各层之间的关系。YJ智能框架针对这些横切关注点设计出了具体的解决方案。本文最后对比分析了面向方面编程与面向对象编程,总结了面向方面编程的优缺点结合实践应用提出了一些基于面向方面编程的最佳实践

第一章 绪论

1.1选题背景及其意义

  基于B/S多层架构的Web系统,由于更高的安全性、可维护性等特点已经取代C/S架构成为企业应用的主流,随着社会的发展,各行各业信息化程度越来越高,企业应用需求不断发展变化,软件应用系统需要实现的业务操作越来越复杂庞大,同时也对软件各方面性能,可扩展性、可维护性、安全、稳定等提出了越来越高的要求。应用需求的发展不停地挑战着计算机软件技术的发展,软件编程方式经历了从最初的面向机器、到面向过程、再到面向对象,每一种新的编程方法学的发展,都为人们提供了一种更为自的方式,可以将系统需求映射为计算机语言的编程结构。这些编程方法学的不断发展可以让人们创建更加复杂的软件系统。面向对象编程(Object-Oriented Programming简称OOP)相比传统编程模式在构建Web系统时显出了它的强大功能,成为了当前主流的编程范型。OOP通过分析、抽象出一系列具有一定属性与行为的实例,并通过这些实例之间的协作完成系统的功能,按照功能或行为对软件系统进行分割,架构整个系统,很好地解决了数据与操作模块化编程,相比以前面向过程编程大大解耦了软件系统。OOP发展到现在出现了很多优秀的面向对象语言,如java它是一种纯面向对象语言,而且java在针对企业应用web系统中提供了一整套基于面向对象的解决方案和技术规范包括有、、、、、等等越来越多的系统采用基于技术的实现也成为人们主要的选择。然而随着软件系统的用户需求的不断发展日益显出了自身的不足。技术中最重要的概念是类和对象。类对数据及其相关操作进行了封装封装带来了隐藏实现细节的好处但同时也限制了设计开发的灵活性和系统的扩展性。只能从业务流程的单一方向设计和实现系统而实际应用系统中业务繁多很多业务都需要执行共同的操作。日志就是一个典型的例子基于传统实现的系统会出现日志类似操作的相关调用代码分散在程序中多处引起代码混乱对系统维护和理解造成较大困难同时也增加了开发人员额外的负担。这种www.docin.com北京交通大学硕士学位论文第一章绪论编程模式还使得在多个类的方法中扩展类似操作变得非常困难丧失良好的扩展性。针对编程模式的不足人们提出了面向方面编程简称它把实现类似日志这样的操作看作一个横切面利用可以很好地解决这种横切问题被很多人看好认为是继之后计算机编程学上又一场重大的革命力求站在一个更高的角度分解应用系统更接近真实世界架构系统解决所处的困境。研究及其应用现状概念最先是由领导的施乐公司帕洛阿尔托研究中心即屺一个研究小组于年提出并随后又申请了的专利。但是思想产生已经有相当长的时间了早在年开始觚屺的研究人员就对面向对象思想的局限性进行了分析形成了概念的雏形甚至还有其他人声明更早的时候就做过与类似思想和方法论的研究如于年发表的论文中提到不修改已有代码如何扩展已有系统功能。随着研究的深入被越来越多的人关注一个项目组近年来也一直花大力量研究还有很多关于的开源项目得到了的支持如目前最成熟技术—一语言也得到了相关项且组的支持公司也推出了他们的框架。目前和合并成了。也引起了微软公司相当大的关注他们也正在加大力量对进行研究甚至在体系中已经不同程度应用了类似的思想。正在逐渐形成一套完整的程序设计思想各种平台的技术也应运而生。平台是应用最早的也是目前运用最为成熟的出现了很多支持的框架如、、和基于的扩展语言这里列举的四种工具都是基于的实现它们被公认为是走在的最前列。然而作为一种新的编程思想和模式仍有待进一步探讨

研究基于设计开发的相关理论目前也很欠缺的具体实现技术还有很多不成熟的地方更没有一个真正的语言所有这些导致距离广泛应用仍然有相当大的距离。www.docin.com北京交通大学硕士学位论文第一章绪论大多数应用仍然处在实验研究阶段仅仅是作为一个辅助工具在被使用在系统开发中的应用也非常有限大多数系统都只是应用工具提供的框架实现解决了某些特定的功能。如企业项目中广泛采用的框架利用框架中提供的功能实现了事务处理与商业业务逻辑的分离。本文研究重点本文将与思想进行对比研究分析它们之间的关系对基于思想的设计和开发做进一步的探讨和研究并分析了系统的特点基于模式重新设计架构系统研究系统中具有共性的一些横切关注点利用语言设计实现基于模式处理这些横切关注点的方案。本文结构安排本文共分为以下五章第一章是绪论部分主要介绍了选题背景及其意义分析了当前主流编程范型模式的局限性介绍本文的研究对象及其研究和应用现状并提出了本文的研究重点和研究方向。第二章是本文对的理论探讨研究部分主要阐述了思想及其相关概念分析了模式与模式的关系探讨了技术实现原理对设计开发理论做了进一步的探讨和研究。第三章基于技术设计分析系统架构的特点遵循多层架构、设计了一种系统架构分析了系统中一些具有共性的、重要的横切关注点数据库连接维护、对象持久化、缓存、权限认证及它们与系统各层之间的关系。第四章是本文的设计实现部分结合第二章对理论的研究基于第三章架构设计和横切关注点的分析采用基于的扩展语言——对缓存、对象持久化、数据库连接维护包含事务处理和权限认证几个横切关注点给出了模式的设计实现方案。第五章与传统模式的系统架构进行对比分析了基于模式架构系统的特点突出显示了在耦合性、可读性、可扩展性三个方面的www.docin.com北京交通大学硕士学位论文第一章绪论优越性同时也提出了基于设计开发中一些不足的地方结合自己实验体会列举了一些最佳编程实践条款。最后是本文的总结总结一些优势并且提出了进一步研究工作www.docin.com北京交通大学硕士学位论文第二章设计、开发研究第二章设计、开发研究基本概念发展至今并没有在业界形成统一的认识目前也没有一个确切的定义尽管如此已经显示出了它强大的优越性。的目的是克服的不足实现系统更好的解耦从一个更高层次更自然地构建系统提高开发效率增加系统的可维护性和可扩展性。的不足就在于类对数据方法的绝对封装性所带来的限制针对实际应用系统中存在着大量的类似于日志这样的横切面这种限制使得很难为多个方法统一进行维护和扩展。而利用一种“横切”的技术剖开类中封装的多个方法可以灵活地对这些方法进行切入新的业务代码、扩展新功能点同时在具体开发实现时不需要对原有的类代码作修改正如所提到的从外部往类中的方法批量扩展新的功能点而不用修改原有的程序代码。以日志操作为例可以用图代表面向对象编程的实现图代表的实现方法包含日志操作调用日志操作方法核心业务逻辑里查墨堡图面向对象编程实现模式日志操作方法厂———通过相关技术日志逻辑二百而牙西痉一方法方法包含日志操作调用核心业务逻辑图面向方面编程实现模式从两图的对比可以看出面向对象编程从单一纵向构建系统图中方法和方法代码中需要显式地包含对日志逻辑操作方法的调用一旦类似业务方法数量庞大将导致日志调用相关代码分散在程序中各处产生混乱而在面向方面www.docin.com北京交通大学硕士学位论文第二章设计、开发研究编程模式中增加了一个横切面从纵横两个方向分解系统图方法和方法不再需要显式地调用日志操作日志操作由相关技术自动织入其内可以认为面向方面不仅仅封装了日志操作的实现逻辑而且也封装了对日志实现逻辑操作的调用相比之下面向方面划分系统更加自然系统耦合性进一步降低。在概念产生和发展的同时产生了一些新的术语关注点如图中所示日志逻辑和核心业务逻辑等这些功能点称之为关注点每一个关注点都是我们需要关心实现的一个逻辑功能点。其中核心业务逻辑这些关注点是实现主要业务逻辑的核心操作称之为核心关注点而类似日志逻辑这些关注点它通过相关技术“横切”织入程序中各个需要它的地方称之为横切关注点。连接点图中方法和方法需要切入日志操作的地方都是连接点它是程序中一个精确的执行点。方法体调用或者执行、对属性赋值或者读取等代码处都可以看作连接点可供织入横切关注业务逻辑连接点为提供了系统功能扩展的空间。通知包含横切关注点的业务逻辑模块可以定义为一个通知通知中还定义了横切关注点和核心关注点切入关系、如何组合实现完整的商业业务逻辑。从不同的角度对通知可以作出不同的分类通常根据切入方式和切入位置分为以下三种前通知、后通知和周围通知在本文第四章中都有具体的应用。切入点就是定义一个由此点切入一些具有共同特征连接点所组成的集合横切面这些连接点都需要切入同一个横切关注点的业务逻辑。一个大的软件系统中通常有很多不同的横切关注点分别对应不同的横切面面向方面编程需要为每一个横切面定义一个切入点定义切入点的关键就是精确捕获横切面对应的所有连接点。方面切入点和对应的通知结合在一起就是方面面向方面中方面的概念和面向对象中类的概念很类似类是封装模块化了属性及属性相关操作而方面是封装模块化切入点及切入点处被切入的通知。甚至在语言中方面实现代码形式也跟类的很相似但方面是从类外面实现对类中方法的扩展在方面内部实现对横切关注点业务逻辑的调用同时描述了横切关注点与核心关注点的www.docin.com北京交通大学硕士学位论文第二章设计、开发研究切入关系。另外∞还允许方面跟类一样定义属性和方法在本文第四章的具体实现中将会看到很多这样的应用。织入将横切关注点与核心关注点按照方面的定义进行组合成完整的业务逻辑这一过程在中称为织入。不同实现技术和不同织入需求织入过程可以在不同的阶段完成编译之前、编译之时、运行之时。上下文主要是指核心关注点方面连接点处一些信息通常指核心关注点业务方法的调用实例、方法名、调用执行的实参等这些信息通常会被横切关注点切入时获得以供在通知中实现横切关注点的业务逻辑。图术语示意图以上术语基本得到业界的认同基于这些术语的技术特征组成了最基本的技术当前绝大多数具都实现了这些技术。语言对语言做了一些扩展在新的语法要素中几乎可以找到与这些术语一一对应的的元素。与关系的介绍面向对象编程是当前主流编程范型是编程学上的一次意义重大的革命面向对象技术将现实世界问题领域与软件编程中对象进行映射对现实世界中的www.docin.com北京交通大学硕士学位论文第二章设计、开发研究问题进行分解、简单化使之符合人类的思维习惯能够自然的表现现实世界中的实体和问题面向对象编程在软件编程学上具有重要的意义。相比以前面向过程语言面向对象语言具备很多新的特点人们利用面向对象的封装、继承、多态思想可以更加有效、自然地构建复杂的软件系统。的优势相比传统编程方法主要体现在以下几个方面高度重用性。面向对象语言利用类封装了数据和相关业务操作实现了良好的模块化提高了系统代码的重用性“对象模型的使用不仅鼓励软件的复用而且还鼓励整个设计的复用同时也导致可复用应用框架的建立”。面向对象编程使得系统带来很大的灵活性。代码结构的改良。由于类的高度模块化和良好的封装性“类是理想的模块化机制它的独立性好修改一个类通常不会引起软件的整体变化往往只需对局部作一些修改”。由此带来一系列的好处耦合性降低、代码易于理解、可维护性和可扩展性增强、易于测试和调试。、较易开发大型软件产品。面向对象编程不仅有利于实现复杂系统的细化而且也有利于团队分工、共同合作许多软件开发公司的经验都表明当面向对象方法学用于大型软件开发时软件成本明显地降低软件的整体质量得以提高。然而发展至今也暴露出了思想的局限性由于类固有封装特性忽略了类与类之间、方法与方法之间一些共同的实现细节横切关注点在面临这些问
题时会导致相同的代码片段分散在程序中各处造成代码纠结在大型的企业应用系统中尤为明显。面向对象编程的发展概括起来经历了三个阶段第一阶段以类为中心设计开发利用类的封装性和继承性很好地实现了系统代码复用性第二阶段以接口为中心可以称为面向接口的开发更注重系统的耦合性第三阶段以设计模式为
中心基于组件的开发进一步提高整个系统设计的复用性。尽管如此面向对象语言仍然无法彻底摆脱在解决横切关注点时的困境。是的补充和发展就是针对的思想局限性设计出的一种新的编程模式是对技术的补充和发展。它与追求的共同目标都是实现软件进一步解耦、提高软件
复用性、增加软件的可扩展性减轻开发者负担、提高开发效率。注意到软www.docin.com北京交通大学硕士学位论文第二章设计、开发研究件系统需求中存在大量的横切关注点而解决横切关注点问题时却陷入代码
混乱的尴尬处境只能封装横切关注点的业务逻辑实现而有关横切关注点的调用代码却会分散在程序中各处分散了核心业务开发人员的精力和注意力不仅增加了开发人员的负担而且对系统各种性能也造成较大的损伤。不仅仅封装了横切关注点的业务逻辑实现而且还封装了对它的调用有效地实现横切关注点与核心关注点的解耦提高了程序的模块化程度。与现有技术不是一种竞争关系而以及相关技术为基础才能实现的开发模式。有了这一新的思想工具并不意味着对开发人员的面向对象编程要求可以降低相反非常依赖于编程模式中良好的编程习惯这好比在开发模式中实现类的方法时仍然需要遵守结构化编程模式。思想模式并不是万能的它并不能解决开发中所有的问题能够很好解决的问题强行追求的实现往往只能是弄巧成拙。对的发展着重体现在对软件系统需求层次上的划分是从单一的纵方向构建软件系统“一切皆为对象”开发者用一组实例以及这些实例之间的关系组合构建软件系统实例的组合按照业务流水单一方向进行。而注意到了系统中另外还存在很多“横切面”增加了从横方向构建系统这不仅大大降低了系统耦合性而且可以非常方便开发人员对系统功能进行扩展在不影响现有代码的情况下通过增加新的横切面就可以实现。将使得开发者可以将应用需求更自然地映射到编程模式之中。对封装性的影响通过定义类来加强系统的封装性隐藏实现细节就是为了对系统进行更好的解耦而横切关注点是模式中被封装的实现细节中共同的部分模式的封装导致放弃了对这些横切关注点的模块化。采用“横切”技术切入中类的方法为开发人员提供了破坏面向对象中类固有封装性的机会然而开发人员利用切入方法内部时只要运用恰当相反可以带来更好的封装性正如所言“我相信应该做的是给程序员提供能写更漂亮的程序的工具而不是施加足够的安全机制让他们不能编写糟糕的程序”。模式就是这种提供更好的模块化程序的工具。应该注意到模式中多个方法都封
装包含对横切关注点的调用并不合适这样的封装会引起代码混乱的目的www.docin.com北京交通大学硕士学位论文第二章设计、开发研究正是打破这种不合适的封装将对横切关注点的调用封装在“方面”里面将被封装的实现细节的共同部分抽离出来实现更好的模块化降低系统耦合性。从某种意义上来说封装了系统的静态部分封装了系统的动态部分。因此单纯讨论是否破坏的封装性并没有什么意义中方法的绝对封装有着它固有的思想局限性而加入却可以使系统的封装性做得更好。与设计模式的关系设计模式是面向对象语言开发经验的积累各种不同的设计模式都定义了解决某一类问题的一种较好的策略著名的《设计模式》对设计模式做了归纳和总结它不仅提供了更好的设计方案而且还提供了基于面向对象软件设计交流的工具。设计模式通过最大程度地利用面向对象的特性诸如利用继承、多态对责任进行分离、对依赖进行倒置面向抽象、面向接口最终设计出灵活、可
扩展、可重用的类库、组件乃至于整个系统的架构。在设计的过程中通过各种模式体现对象的行为、暴露的接口、对象间关系、以及对象分别在不同层次中表现出来的形态。然而鉴于对象封装的特殊性“设计模式”的触角始终在接口与抽象中大做文章而对于对象内部则无能为力。而且由于设计模式过于依赖接口和追求抽象与实现的分离有时会给人带来设计的两难抉择简单实现或者灵活设计。是对设计模式的延续突破了对象的封装将系统中不同的关注点分为核心关注点与横切关注点并将之映射成面向方面的一种编程方式。并不需要借助接口和抽象而是利用横切技术直接深入到对象内部截取方法之间传递的消息可以随意织入各种通知在不改变原有类的代码基础上实现该类功能的扩展。之所以较设计模式功能更加强大使用更加简单关键就是在于设计模式是对面向对象编程语言的一种编程技巧而面向方面思想是对面向对象思想的进一步发展模式更接近现实世界构建系统。技术实现原理目前没有纯粹的语言绝大多数的工具和扩展语言都是基于面向对www.docin.com北京交通大学硕士学位论文第二章设计开发研究象语言的扩充在领域实现主要有两种方式动态代理实现和基于面向对象语言的扩展。动态代理实现标准类库包中有代理类和调用处理柄接口类中提供了方法。该方法可以产生一个代理实例并且代理实例与被代理实例具备相同接口被代理实例就是核心业务方面的实例因此动态代理实现都要求为所有核心业务类定义相应的接口。两者的代理关系通过实现接口的方法来确定在核心业务实例被代理的时候可以实现切入横切业务逻辑还可以拦截核心业务逻辑的执行同时方法中的参数也为切入时捕获核心业务方面上下文提供了条件。这些具体实现通常封装在一个工厂类中程序中需要新建核心业务实例时由该工厂提供一个代理实例。厂的实现代码示例如下利用的代理机制获取代理对象。代理对象与被代理对象具备相同的接口其中实现了接口示例代码如下】恤www.docin.com北京交通大学硕士学位论文第二章设计、开发研究。脏方法调用前可以切入相应横切业务逻辑还可拦截核心业务逻辑地执行”核心业务方法执行之前可以切入横切业务逻辑”调用核心业务逻辑方法在方法调用后可以切入相应横切业务逻辑乱“舯”核心业务方法之后可以切入横切业务逻辑”
动态代理实现时捕获上下文可以在方法中进行方法有三个参数】分别暴露了核心关注点被调用方法的信息被调用方法所在的实例被调用方法被调用方法的行参列表。通过语句“”的调用执行核心业务中被捕获的方法在该语句前后就可以切入相应的横切业务逻辑甚至不执行该语句实现拦截核心业务方法的执行。假定程序中有这样的核心业务类及其对应的接口如下蛔”执行核心业务方法”测试代码如下执行结果如下核心业务方法执行之前可以切入横切业务逻辑执行核心业务方法核心业务方法之后可以切入横切业务逻辑下图描述了动态代理机制实现原理www.docin.com北京交通大学硕士学位论文第二章设计、开发研究核心豁垂务盍一一一一一一一一…一…一一一‘通过获取接口类型的代理对象被代理实例为类的实例■………………一图动态代理实现原理图动态代理实现机制基本上都利用了这一原理并配合文件的使用同时利用的反射机制提供了一个框架。这种实现机制最大优点在于不需要额外的编译器和新的语法学习、、这几种工具都是基于动态代理机制的实现然而在实际应用中存在以下问题由于代理实例的引入增加了额外的类加载和对象的创建虽然各种框架都采取很多措施进行优化但对性能产生的影响还是比较大。由于大量反射机制的应用对程序的容错和效率也造成了较大的影响。动态代理实例的产生需要为原始类定义接口并且对象的产生必须通过特定的工厂产生同时还需要配置一些文件在文件中定义连接点的捕获、横切方式和切入粒度等等增加了开发者负担在使用上不够灵活功能也不够强大。动态代理由于利用反射机制方法来调用核心关注点方法无法支持基于静态方法的连接点捕获。动态代理主要是对方法的代理无法支持对基于属性的连接点捕获www.docin.com北京交通大学硕士学位论文第二章设计、开发研究在动态代理框架应用中框架是其中杰出的代表在企业应用中被广泛采用提供了一个轻量级的容器可以用来管理业务对象在框架内可以很方便地实现面向方面事务管理使其与核心业务逻辑分离。另外还有一种实现的方法就是利用班库利用它的代码增强功能可以动态地为中的类生成子类实现原理基本类似只是这种实现方式可以不再依赖接库在框架中实现对象持久化操作有很多应用在后续章节将作进一步的介绍。。基于面向对象语言的扩展语言是基于面向对象语言的扩展在语言基础上增加新的关键字来实现技术如方面、切入点、前通知、后通知、周围通知等等提供专用的编译器来时识别这
些新语法要素在生成字节码前编译器修改需要被切入方法的相关源代码从而实现“横切织入”然后进行正常面向对象语言的编译生成字节码。的优点非常突出这种类似预编译的静态织入方式完全消除了动态代理机制对性能的影响。与代理机制实现相比不仅可以捕获基于方法的连接点而且还可以捕获基于类属性的连接点甚至还可以很好支持基于静态方法连接点的捕获。同时由于新语言要素的加入可以很方便地定义切入点、通知等与思想术语相对应的语言成分利用新的关键字捕获上下文也变得非常容易、自然可读性也更好更加灵活地发挥了思想的功能特性。同时保持着原始语言的编码风格开发人员很容易就可以运用自如充分将面向方面编程思想应用到实际编码中来。本文认为是目前最接近未来纯粹的语言已经被越来越多的人看作是事实上的标准也得到越来越多技术的支持例如以上版本已经完全集成了。当然也有它不足的地方由于静态式的织入往往一个横切关注点横切了多个类的方法程序中只要对代码做一点点修改所有相关的源文件都需要重新编译在实际应用中也会带来一些不便。有关的一些语法特点在本文后续章节具体设计实现中还有进一步的介绍。需要说明的是的技术实现并不是本文的研究的重点但是任何一种新的www.docin.com北京交通大学硕士学位论文第二章设计开发研究理念在其产生早期技术实现都非常重要。作为一种新的编程思想理念非
常需要技术实现的支持好的技术实现有利于理念的推广“理论与实践相结合”使其在实践中不断地发展和完善。设计开发探讨与研究基于面向方面需求分析面向方面编程核心思想就是分离核心关注点与横切关注点实现分别专注这两个方面编程对软件需求的深入理解是软件开发获得成功的前提条件面向方面的需求分析重点是对用户所关注的逻辑功能进行分类并分别映射到中的核心关注点和横切关注点。如何将业务流程中主要业务流程同它的分支流程、非核
心业务功能分离开来分别作为核心方面和横切方面并明确它们之间的横切关系。有关这方面的理论目前正在不断的发展和完善之中和合著的—提出了基于用例图分析和合著的—提出了一种方法进行分析与设计。基于的设计开发权限认证、事务、日志等等已经普遍被认为是软件系统中横切粒度很大的系统级横切关注点根据系统实现的具体业务功能往往还
存在各种粒度不一的业务级横切关注点面向方面需求分析关键就是在需求阶段
尽可能地识别出各种关注点分离系统的横切方面和核心方面将整个应用系统进行面向方面的模块划分降低整个系统耦合性减少设计开发的难度。将原始需求信息比作一束光束那么识别关注点识别过程可以用三棱镜法则来形容穿越三棱镜的光束需求信息经过三棱镜折射关注点识别照射出来不同颜色的光束关注点实现基于面向方面的需求分析如下图所示www.docin.com北京交通大学硕士学位论文第二章设计开发研究图关注点识别三棱镜法则设计层次良好的架构实现核心业务流程分离出去横切关注点业务逻辑后可以专注核心业务流程进行架构设计和编码架构设计的层次性和编码的规范性很大程度上影响“横切织入”的复杂度。核心关注点方面业务流程仍然是系统设计的重点在系统中通常采取基于模型一视图一控制多层架构在业务层根据业务的复杂度还可能再分层这种多层的架构不仅降低了系统的耦合性和复杂度而且也非常有利于对不同层的代码切入不同的横切关注点一般来说不同的层都有它不同的“横切面”如权限认证通常作为控制层的横切面而事务处理作为业务层的横切面。传统的面向对象设计通常还会增加很多接口来进一步解耦层与层之间的关系、增加系统的灵活性和扩展性思想并不依赖接口它提供了新的开发模式和语言工具使系统设计和开发更加灵活同时可以在不改变原有代码的基础上增加横切面利用“横切”技术自动将新的功能切入系统中提供一种全新的系统扩展方法。因此可以对传统的接口设计作一定的简化力求系统架构清晰简洁。定义切入点切入点定义了供通知切入的一批连接点连接点的数量决定了横切粒度每一个连接点都是系统的功能扩展点针对某一个横切关注点如何准确的捕捉需要将其切入的所有连接点是定义切入点的关键。中同时支持基于方法和属性的连接点捕获通常主要根据以下几种方式进行捕获。在中主要是根据方法和属性原型定义的特征定位相应的方法或者属性。方法原型名称格式为“访问修饰【】返回值类型包名类名方法名形参www.docin.com北京交通大学硕士学位论文第二章设计开发研究列表”属性的原型格式“访问修饰【】类型包名类名属性名”。通过对它们的匹配捕捉方法的调用、执行和属性的读取不同的具可能采用不同的匹配技术中使用了正则表达式进行匹配而语言中定义了三种专用的通配符’代表了除‘’之外任意字符串‘’代表了任意字符串包括‘’字符‘’代表了该类及其所有的子类Ⅱ中还提供了特殊的关键字来匹配构造函数。面向对象中的方法有两种状态方法的定义和方法的被调用根据这两种状态分别定义了两种连接点在方法体的首尾进行切入编译器可以直接批量修改被捕获的方法体代码该方法一旦执行就会自动调用横切业务逻辑在方法被调用的时候在调用处前、后进行切入横切业务逻辑编译器会在被捕获的调用处前后加入相应横切代码。这两种切入方式都可以拦截被捕获业务方法的执行。面向对象中对属性的操作有两种读取和赋值根据这两种操作也分别的定义了两种连接点捕获对属性的读取操作捕获对属性的赋值操作。方法、属性被调用处所在代码即方法被调用或者被定义、属性被读取或者赋值时所在类名含包名或所在方法名中提供了和两种关键字分别定义这种匹配。通常和配合使用。中提供关键字和定义调用流程之间的关系所谓流程关系例如方法的方法体中有调用方法就认为执行的流程中存在对的调用不仅类的方法中存在流程关系方面各个切入点也存在流程关系。和的区别在于连接点自身是否处在自己的流程中。利用切入点的流程关系可以定义当同一连接点被不同切入点捕获时的横切业务逻辑的切入顺序还可以控制嵌套切入。将以上各种匹配特征进行逻辑组合实现更加灵活的匹配方式语言中利用与、或、非三种逻辑操作符进行组合匹配。一个好的编码规范对连接点的捕获很有作用特别是系统架构层次的划分和类www.docin.com北京交通大学硕士学位论文第二章设计、开发研究所在包的组织及各种包名、类名、方法名的命名方式。组织核心关注点与横切关注点的上下文横切关注点与核心关注点业务逻辑在代码实现形式上完全分离通过“横切织入”将它们组合在一起实现完整的业务流程所以横切关注点方面就需要获得核心关注点方面上下文才能共同处理流程中的数据信息。方法调用的连接点上下文主要为被调用方法所在的实例、方法的参数、方法名和方法返回值等等。通知中实现横切关注点业务逻辑处理的数据都是正对这些上下文信息在中提供了和关键字可以在定义切入点的时候将方法的实例和参数显示的暴露给横切方面在通知实现代码中还可以获得函数返回值另外在通知体中还提供了关键字该关键字的两个方法和可以分别获取被调用方法的名称和所有实参列表。另外还可以利用模式在横切方面和核心方面之间传递上下文信息。中类实现了模式定义一个变量就可以实现以当前线程为关键值保存各自的数据信息。在系统中用户每一次请求提交服务器端都需要完成一个完整的流程控制层接收请求、调用业务层处理相关业务、业务层连接后台数据库进行处理返回处理结果给控制层、控制层将
处理结果交予显示层对用户作出响应。流程之中存在各种连接点需要切入横切业
务逻辑而在用户的一次会话期间整个完整业务流程中不管系统执行核心业务逻辑还是横切业务逻辑绝大多数都是在一个线程之中根据这一特点利用变量就可以很方便在核心方面与横切方面之间进行数据传递在本文的设计实现中多处使用了该类型变量在横切方面中实现上下文的捕获。www.docin.com北京交通大学硕士学位论文第三章系统架构设计与分析第三章系统架构设计与分析系统架构设计原则在基于的系统架构设计中有许多好的原则可供遵循在本文的设计中同样遵循着以下一些设计原则多层架构原则。将业务与数据、现实分离降低系统的耦合性系统通常都采用基于的多层架构各层都对其他层隐藏自己的实现细节尽可能隔离复杂性。简单原则。如果能用的工作完成的工作则选择较简单的解决方案。系统分层的过多也会带来实现的复杂性一些重量级的组件不加选择地使用也会增加系统实现难度、减少系统的可维护性没有充足的理由就不要使用。模块化原则。“模块化是被分解成具有内聚性但松散耦合的模块的系统特性”模块化对提高系统重用性的具有重要意义可以增强系统的可读性和可维护性。在设计和实现中我们会作很多工作来达到更好的模块化。整体架构设计系统越来越多地应用于大型商业领域中业务复杂系统极为庞大人们更加注重追求系统进一步解耦、提高系统的可维护性和可扩展性。系统的运行模式一般为基于客户端向服务器提交请求由服务器端负责所有业务处理、访问后台数据库然后对用户作出响应服务器端集中了几乎所有的业务逻辑客户端通常只负责显示功能习惯称之为瘦客户端因此系统架构设计集中在服务器端逻辑设计。本文基于技术探讨设计系统的架构是针对在企业应用系统的一套完整的技术规范图是标准模型。www.docin.com北京交通大学硕士学位论文第三章系统架构设计与分析图标准模型标准模型规定使用做为业务处理组件充分体现了在并发、分布式计算上的能力但本身使用过于复杂用做业务处理过于死板定义的标准确实很强大很多子标准制定得非常出色但是同时也很复杂总
是显得过于臃肿结构笨拙实用性也较差反倒是非标准的模型比较有影响力这一领域一些开源项目占据了主流位置。面向对象技术已经相当成熟而且稳定人们在面向对象编程开发实践中积累了很多宝贵的经验总结出了大量实用性很强的设计模式本文基于技术构建的系统遵循的多层结构进行架构系统如图所示图系统多层架构其中页面负责客户端浏览器显示所有来自于客户端的请求统一交由相应的控制器处理收集请求数据并调用业务层业务操作进行相应处理然后将处理结果数据通过对象转发至待显示的页面页面最后在客户端浏览器进行显示以响应客户的请求。其中服务器端应用程序需要通过连接数据库而业务层业务对象简记为并不直接访问数据库而是先由封装数据库连接在中www.docin.com北京交通大学硕士学位论文第三章系统架构设计与分析获取数据库连接实现读取数据库的各种基本操作实例读取数据库时先获取一个实例通过该实例访闯后台数据库。整个架构中核心方面流程如图顺序图所示圈圉圈图系统核心方面顺序图详细设计分析数据层在数据层需要解决面向对象语言访问关系型数据库的问题建立映射是有必要的将对象语言访问关系型一些复杂、繁琐的操作封装隐藏起来。映射就是建立起“关系数据库中的表”与“面向对象语言中的值对象类”之间的对应关系值对象类∞简记为就是一个普通的类它只有属性及属性相应的和方法数据库中每一条记录都映射成一个实例数据库中表的字段通常都对应到实例中相应的属性。基于映射思想访问数据库时将针对记录的基本操作增加、删除、修改、查询映射为针对的相应操作传统的语言使用也会作些改变表名由类名代替、字段名由属性名代替。在的开源项目中已经有很多优秀的框架、工具实现了映射其中以框架应用最为广泛很好地实现了映射封装了数据库连接提供了与类似的语言。可以在等框架基础上封www.docin.com北京交通大学硕士学位论文第三章系统架构设计与分析装的实现除了封装基本操作访问数据库以外还需要提供一些有关事务和数据库连接维护的方法如下手断是否拥有数据库连接胴矢取数据库连接关闭数据库连接开启事务提交事务回滚事务通过的封装解决面向对象语言访问关系型数据库的问题隐藏了实现细节使得业务层与后台数据库迸一步解耦。中的这些基本操作方法供业务层实例调用简化了业务层对数据库的访问。而在业务层集中了所有具体商业业务逻辑实现可以对实例的各属性值进行修改这些修改操作都需要对应到中对相应数据库记录的更新操作这一操作称为对象持久化操作。在中提供了方法由该方法封装持久化操作逻辑。在业务层调用实例的方法修改实例的属性值时就需要调用方法将修改后的值持久化到数据库中传统的实现代码示例如下通过∞方法修改产品的名称脯修改后的信息保存在数据库中很明显这样做放任了一个横切关注点——对象持久化逻辑分散在程序中多处导致程序员会多次调用这一操作同时还需要开发人员自己判断是否需要进行持久化程序中有些实例并不是由数据库记录映射而来的可能是临时新建的对象对于这些实例的修改不需要持久化无疑增加了开发人员的负担。因此关于对象持久化方面的工作有必要将这一横切关注点分离出来用方面封装它的实现和调用。业务层业务层由实例业务实例组成在每一个类中实现相关的一批业务操作如前文所分析每一个类访问数据库都需要获取一个实例通过www.docin.com北京交通大学硕士学位论文第三章系统架构设计与分析实例访问数据库。基于这一特点可以为所有的类定义一个父类业务层类图如下图业务层类图中的属性设为保护类型可以被它的子类使用。同时利用中的方法也实现了对实例的一些基本操作的公用方法可以根据需要直接被控制层调用。控制层调用业务层中方法执行具体的商业业务一个完整商业务操作流程步骤通常如下获取一个实例通过它获得数据库连接开启事务如果该业务操作不进行写数据库操作可以不用处理事务执行具体业务逻辑捕获业务逻辑执行是否有异常决定提交事务或者回滚事务绝大多数异常都不会进行错误恢复。关闭中的数据库连接通常是将数据库连接归还数据库连接池其中步骤、、、中数据库连接维护包括事务处理是核心业务流程中的横切关注点开发模式不管将它们放在层还是业务层每一个业务方法的调用或者执行都需要操作、提交或者回滚事务、关闭数据库连接这些代码片段分布在程序中的各处必然导致代码重复、混乱加重开发负担。究其原因就是思想在处理横切问题上的局限性本文第四章将设计实现基于的解决方案。控制层在控制层接收客户端的请求根据请求信息调用业务层业务操作完成具体业务www.docin.com北京交通大学硕士学位论文第三章系统架构设计与分析流程然后转发至页面响应客户端请求显示给用户处理结果。在控制层主要是控制器的设计和实现通常一个用户请求会对应一个控制器或者控制器中的一个方法。在标准的技术中简称可以充当控制器由的或方法接受用户的请求并调用相应的业务层进行处理最后转发至页面由于每一个都需要在文件中作一些配置如果每一个用户请求都定义一个与之对应则会加大的配置规模这在一个大型的企业应用系统中是无法忍受的。因此需要对此该层进行细化重新设计。在控制层至少做了两件事地址解析找到对应的控制器处理请求控制器调用后台业务逻辑返回处理结果。针对这一特点本文设计如下将控制逻辑抽取出来单独定义实现控制类控制类中每一个方法都可以对应一种用户请求。由于控制类主要是处理和对用户可以为所有的控制类定义一个父类在此将它定义为抽象类示例代码如下卸
∞廒取用户请求的对象默认控制方法定义一个类充当所有控制类的派发器负责地址解析通过反射机制产生控制器类并调用相应控制方法处理客户端提交的请求对象这样文件中只需要对该类做配置即可。以下是控制层的顺序图www.docin.com北京交通大学硕士学位论文第三章系统架构设计与分析图控制层顺序图在各个子类中所有的方法也存在一个横切关注点用户的每一个请求到达类方法在调用后台业务逻辑之前都需要进行权限认证。当前很多系统中都利用过滤器来拦截用户的请求进行验证操作一般来说都能较好地满足实际应用需求但它仍然存在两个问题效率很低所有的请求都经拦截过滤。可读性较差横切业务仍然与核心业务纠结在一起。把权限认证作为控制器类一个横切关注点基于实现可以提供一个更加清晰和高效的架构。访问系统静态数据一个大型的系统中业务操作复杂业务信息读写频繁系统中仍然存在一部分数据信息是相对静态的如业务基础数据、国家地区城市、网站配置菜单、角色权限等信息这些信息变动很少但是读取却非常频繁对于这一部分数据进行缓存减少对数据库的访问可以大大提高系统的性能。本文的设计方案就是在系统中增加一些工具类专门实现读取这些数据工具类中所有的方法都定义为静态的以便在页面控制层中直接通过类名进行调用。在组织这些工具类时由于工具类中的方法仍然是实现一些业务操作故将www.docin.com北京交通大学硕士学位论文第三章系统架构设计与分析它们和类放在同一个大包路径下包里建两个子包和分别存放类和这些工具类。如图●◆◆∞嘲◆图静态信息业务类图对工具类中所有方法执行的返回结果进行缓存就可以实现性能的提高很显然“缓存”也是一个横切关注点如果直接在方法中实现缓存同样出现代码重复增加开发人员负担。横切关注点与层的关系分析通过以上分析我们确定了有四个横切关注点分布在系统之中在系统层次设计实现中每个层所在的包路径都不一样显示层主要都是一些?文件在项目中通常直接放在程序部署的根目录下本文为这些文件统一定义包路径包。控制层主要由一个类分发器和多个类控制器组成类所在的包路径定义为。类所在的包路径定义为控制层中所有的类都放在包下。业务层主要有两种类静态业务方法所在的工具类的包路径定义为而其他业务对象类的包路径定义为。前者可以调用后者系统访问数据库都需要通过具体的业务对象类的方法。数据访问层通过封装对面向对象语言对关系型数据库的访问隐藏映射的实现同时还需要在层定义各种值对象类供各层使用。图是系统层和主要包的调用结构关系图其中横切关注点如图中注释部分所示www.docin.com北京交通大学硕士学位论文第三章系统架构设计与分析显示层自控制层

留数据层图系统各层、包之间调用关系图中注释部分标出了四个横切关注点缓存、对象持久化、数据库连接维护、和权限认证以及它们所需要切入的包。这些横切关注点涉及系统中核心业务流程的三个层次控制层、业务层和数据层它们在开发模式下都解决得不太好。下一章本文将利用语言针对这些横切关注点详细设计基于的解决方案实现它们与核心业务完全分离。印璺彳邕婴www.docin.com北京交通大学硕士学位论文第四章的应用与实现第四章的应用与实现本章采用语言着重针对第三章分析的横切关注点进行详细设计与具体实现对基于思想的设计开发做进一步的研究。实验环境的搭建开发环境的搭建本文实验基本软件、硬件环境为操作性统专业版为内存为的的笔记本式计算机。软件开发工具主要都是开源的如下面向对象语言版本为在的网站可以免费下载获得它的安装程序目前最新版本是但企业实际应用中并没有被广泛采用大多数仍然使用的版本。集成开发编辑工具在的官方网站可以免费下载获得压缩包解压后就可以使用不用安装。不仅开源免费而且功能非常强大提供了很多代码辅助、跟踪调试、项目管理等实用功能还有各类丰富的插件通过插件的扩展的功能将进一步增强使用更加方便。服务器采用的版本是的免安装版的网站上可以下载获得。配置非常简单本文基本采用它的默认配置它对硬件性能没有太高的要求通过的插件可以和组合在一起使用。数据库使用的是免安装版下载压缩包后直接解压运行系统就会在后台启动网络服务同时下载最新的驱动在中通过就可以访问该数据库。在很多方面较以前版本有了很大的改进。开发环境的搭建目前虽然没有纯粹的语言却出现了很多工具和基于面向对象语言扩展的语言其中以基于的扩展最为突出在使用上非常符合编码习惯语言表达面向方面编程思想非常自然。利用预编译www.docin.com北京交通大学硕士学位论文第四章的应用与实现实现了代码的“横切”织入不管在易用、效率、功能上都很出色已经逐渐被更多的人视为的实现标准越来越多的人倾向于用描述的思想可以很好将思想映射成具体的实现编码。在的开发环境下搭建主要以下两步编译器的安装本文实验中采用的是当前最新的版本和合并后归于基金下的项目。由和酬公司赞助添加了一系列特性以支持它的下载地址是一下载得到一文件在正常环境下包的默认执行程序为直接点击该文件运行安装安装完毕后需要设置两个环境变量在中添力Ⅱ在中添加插件的安装插件需要和版本匹配本实验中采用的下载的插件压缩包为下载地址一—。插件的安装非常简单解压包得到两个文件夹和只要将这两文件夹下的文件释放到目录中对应文件夹下即可。安装好插件后的环境就可以支持使用语言进行开发了除了原有代码系列辅助功能还提供很多的辅助功能方便基于进行项目开发。以下的详细设计开发都是在该环境下进行实验和测试的。对象持久化数据库设计分析及映射第三章已经分析对象持久化的操作主要在数据层数据层封装面向对象语言对关系型数据的访问实现细节。以一个论坛系统为例数据库中主要的表结构如下www.docin.com北京交通大学硕士学位论文第四章的应用与实现图论坛系统主要的表结构这三张表将分别映射到面向对象语言中三个值对象类用户表对应类帖子表对应类版块表对应类。除了类与表对应类中也会有与表中每个字段对应的属性每一个属性都会有一组方法和方法。通过方法访问值对象类的属性值达到访问数据库相应字段的信息相应地对方法调用修改实例的属性值时就会对应到对数据库信息同步这一对象持久化操作如前文所分析是一个横切关注点下面基于思想实现分离该横切关注点与它的核心业务。横切关注点业务逻辑设计分析分离对象持久化横切关注点时需要解决以下问题只对从数据库记录中映射产生的实例进行持久化。系统架构中的已经封装了面向对象语言对关系数据库的访问所有的实例都是通过中的方法获取得到因此可以对所有的方法增加一个横切关注点记录所有由映射产生的实例借以判断程序中实例是否需要实例化。需要确保每一条数据库记录在用户的一次会话中只能映射成一个实例因此用户每次读取数据库需要检查读取的实例以前是否已经读取过如果读取过则需要对已读取的数据与数据库进行同步不需要再次映射产生新的实例只需返回已读取的实例即可这一操作应该在通过连接获取数据集映射实例时进行。一个好的映射框架都应该实现该功能。www.docin.com北京交通大学硕士学位论文第四章的应用与实现业务层可能会对实例进行多个属性值、多次的修改如果每次修改都更新数据库进行持久化使得访问数据过于频繁而且低效对系统性能会造成较大的损害因此对实例修改的持久化操作应该放在事务提交之前统一进行尽量减少对数据库的访问。综合考虑上述第点和第点假设用户在一次会话中两次访问数据库获取了同一实例如果在第二次访问数据库前修改了第一次访问数据库获取的实例那么第二次访问数据库将可能获得脏数据而且获取实例进行同步第一次获取的实例将会覆盖对实例值的修改。因此持久化操作需要在实例值修改后下一次数据库访问之前进行确保访问数据库获得最新的数据。通过以上分析持久化操作方面编程需要在业务层捕获两类连接点调用类的各种方法访问数据库。在该连接点处切入的横切业务逻辑持久化已经被修改后的实例同时记录由映射新产生的实例调用实例的方法。在该连接点处设置标志实例相应字段已被修改。另外在业务方法执行完毕进行事务提交之前也需要检查是否还有实例需要持久化下面章节中会讨论事务处理横切关注点的实现在事务处理方面的通知体中加入持久化逻辑即可。数据结构设计通过节的分析对象持久化业务逻辑主要是记录所有映射产生的实例并同时记录程序中对这些实例所作的修改在适当的时候进行数据持久化操作。设计以下数据结构保存本次会话期间所有相关实例信息www.docin.com北京交通大学硕士学位论文第四章的应用与实现图持久化数据结构图在该数据结构中每一种类型的实例对应中的一条键值对的类对象为键值又是一个对象。在值对象中的每一个键值对记录实例及其所有修改过的字段。基于该数据结构设计持久化操作类—如图◆图类图该类中主要定义了一个静态变量和三个静态的公有方法由于系统都是多用户并发访问对于每一个用户访问服务器都需要保存当前线程地持久化信息因此定义变量该变量中存储的对象即为上文中卵对象。方法。记录映射产生的实例如果该实例已经记录则进行同步并返回该实例。方法。记录某个实例已经被修改持久化操作会根据该修改情况同步数据库中对应的记录。。如果存在实例有字段被修改拼装语句进行对象持久化操作同时清除实例字段被修改信息。捕获对类方法的调用定义切入点捕获在业务层对类方法的调用在这些被捕获的连接点处切入横切业务逻辑在方法被调用前检查是否有实例需要持久化调用执行完成后同步已有映射产生的实例保证同一次回话中每条记录对应一个www.docin.com北京交通大学硕士学位论文第四章的应用与实现实例再一次记录映射产生新的实例由于连接点前后都需要切入横切业务因此定义基于该切入点的周围通知示例代码如下定义切入点。’捕获所有对类方法的调用。限定在业务层定义后通知腩所有已经修改过值的实例进行持久化同时记录新映射生成实例该通知流程描述如下图方面通知流程图捕获实例的方法在业务层类中捕获实例的方法切入的横切逻辑判断实例www.docin.com北京交通大学硕士学位论文第四章的应用与实现是否来自数据库记录映射产生从而决定是否需要进行持久化操作。大致实现代码如下定义后通知即可定义切入点曲?’。捕获所有实例方法的调用限定在业务层廒取上下文实例定义后通知判断实例来自数据库记录的映射决定是否记录该实例需要持久化中的实现原理本人实际项目开发中几乎都采用框架它很好地实现了映射的同时对持久化也做了很多工作较好地满足了实际应用需求因此在项目实施中持久化横切关注点并没有采用本文基于的实现方案。然而从以上分析和本人对代码各个局部实验测试来看该方案从映射中分离出持久化相关横切关注点程序结构更加清晰、易于实现、减少了开发工作量。而框架由于利用类库为类生成代理类增强了类中的和方法这也是一种基于代理机制编程思想。是一个强大的、高性能、高质量的生成类库它可以在运行期扩展类也可以动态实现的接口类库也是开源的项目。利用实现原理与基于中的类的实现非常类似只是它可以不再依赖接口直接利用类生成一个原有类的子类则原有类的每个方法调用都会调用接口的】函数。在函数里就可以通过执行“”来执行实例原有的方法或者方法在该语句执行前后切入所需要的横切业务逻辑根据需要甚至可以不执行核心业务操作都可以。示例代码如下www.docin.com北京交通大学硕士学位论文第四章的应用与实现生成的子类被回调接口的方法。【】”调用日志方法”
利用类库实现以上所有的实例都通过该工厂“方法创建获得则该实例的所有方法体中第一行都会被切入语句”调用日志方法”同时接口方法的参数列表也暴露了核心业务数据信息可以供横切业务捕获相应的上下文。正是利用这一原理动态生成实例并在其方法和方法中切入了持久化相关的横切业务逻辑。另外在组织多个实例之间的关系时为了提高性能还切入了对某些属性延时加载的功能。数据库连接维护横切关注点分析数据库连接维护是业务层中类的业务方法的横切关注点业务层所有类都继承基础类。类定义为抽象类在该类中实现了最基本、最简单一些业务操作如向数据库中添加一个实例、删除一个实例、通过语句得到列表等这些方法既可以被业务层外直接调用也可以在层类调用提高系统的灵活性。在的子类中实现一些具体业务业务层中的类的方法调用关系如下www.docin.com北京交通大学硕士学位论文第四章的应用与实现图业务层类调用关系图图中利用代表各种不同业务类尽可能体现业务层的各种调用关系将这些调用关系分成三类业务层对本层外部的调用类依赖实例访问数据实现商业业务方法业务方法中所有数据库读写操作都需要借助于中的方法因此需要调用类中的方法业务层被层外部调用在本文架构中只限于控制层和工具类中的方法对它们调用为了提高业务层中方法的代码重用性业务层内部必然也会存在相互调用的关系。所有的业务方法都需要通过数据库连接访问后台数据库都需要进行数据库连接维护操作为了提高整个系统的性能应该把中的实例设置为延时加载避免不必要的实例的创建在需要使用它的时候才创建提高数据库连接的利用率。因此创建实例应该是在类中对属性读取的时刻。www.docin.com北京交通大学硕士学位论文第四章的应用与实现当实例在包内互相调用时需要确保一次业务流程的执行只能使用同一个实例保证一次完整的业务处理中使用同一个数据库连接因此还需要将创建的实例保存起来供当前线程公用在创建之前需要判断当前线程是否已有实例从而决定是否需要创建。同时数据库维护中还包含对事务的处理事务处理并不是每个业务方法都必须的只有当业务方法涉及“写数据库”操作时才涉及事务需要解决一个问题区别类的业务方法是否需要事务很多工具由程序开发人员通过定义文件对每个类业务方法作一些事务配置由程序读取配置文件决定是否切入事务。定义文件无疑增加了开发人员的负担。对于事务处理的判断本文给出另外一种设计方案。分析类对数据库的封装业务层访问数据都需要对通类的方法进行类中的方法是很有限的而且比较固定那些需要写数据库的方法也是比较明确如下列举的方法通过实例再数据库插入一条记录。通过实例更新数据中一条对应的记录。。通过实例删除数据库中对应的一条记录。和通过语句前者不带参数后者带参数写数据库和通过语句前者不带参数后者带参数写数据库一旦捕获到以上这些方法的调用开启事务并标记之再次捕获时根据该标记可以避免多次开启事务。在整个业务方法执行完毕后根据标志决定是否需要作事务处理提交或者回滚同时关闭数据库连接。另外在本章节讨论了基于实现持久化方面的操作在实际应用系统都运用了框架已经做好了持久化这些写数据库操作自然也需要事务如何捕获这些连接点中隐藏了这些持久化操作的实现无法直接捕获但是可以捕获对映射产生的实例的方法的调用一旦捕获www.docin.com北京交通大学硕士学位论文第四章的应用与实现同样开启事务设置事务开始标志。通过上述的分析有三类连接点需要捕获在类中捕获对属性的读取切入创建实例逻辑在类中捕获对需要写数据库操作的方法的调用和对映射产生实例的方法的调用切入开启事务逻辑在包外捕获对类方法的调用切入捕获异常决定是否提交事务或者回滚事务以及关闭数据库连接。对这三类连接点及其对应的横切业务逻辑分别定义方面进行实现。创建实例方面编程创建实例的流程如下图所示图创建方面横切业务流程首先需要定义该方面的切入点捕获所有的连接点在类中捕获所有对属性的读取切入的横切业务逻辑如图所示需要判断当前线程是否已创建实例而决定是否创建实例。因此一旦创建实例就使用中的变量保存起来在该方面中同时提供静态方法获得该实例并将调用创建实例的逻辑也封装在其中。定义方面示例代码www.docin.com北京交通大学硕士学位论文第四章的应用与实现如下定义切入点定义前通知直接返回当前线程的实例’定义变量保存当前线程的实例腹淡取当前线程的实例硼从变量中获取当前线程的实例如果当前线程没有创建Ⅱ建实例变量中保存创建雕实例返回当前线程创建的实例
分析上述方面的实现代码可以看到属性一直都没有进行赋值而且通知也没有的调用屏蔽了对核心业务中对属性的读操作通知体中采用了进行代替直接返回当前线程创建的实例供核心业务访问数据库所有中的属性的作用已经失去了原有面向对象语言中属性的作用在这里它只充当了面方面定义切入点时一个供捕获的特征。但是方面
的切入对于面向对象实现核心业务编程却完全是透明的开发人员还是可以按照
原来的面向对象语言方式实现核心业务只是不再受横切业务的干扰。这是面向方面编程一个对面向对象比较彻底的思想突破。开启事务方面编程该方面编程需要捕获的连接点对需要写数据库操作方法的调用和对映射产生实例方法的调用。前者本文已经分析就是中仅几个有限的方法会进行写数据库操作捕获这些连接点比较容易利用‘¨’操作组合分别对每个方法的原型特征匹配即可。www.docin.com北京交通大学硕士学位论文第四章的应用与实现对于捕获调用实例方法的连接点由于数据层使用了框架判断实例是否由数据库中记录映射产生有两种办法框架将所有映射产生的实例都缓存在了中并且提供了可供调用。可以捕获所有的实例方法的调用然后判断该实例是否在中从而决定是否需要事务。另外也利用库增强了实例的和方法其实映射产生的实例都是类子类的实例这些子类都实现了一个接口。通过对捕获这个接口的子类可以过滤掉其他的实例。本文选择第种方式捕获这些连接点。另外横切业务一开启事务在连接点处核心业务之前执行通知类型为前通知定义方面示例代码如下定现入点定义切入点’’。’’捕获类有写数据库操作方法的调用’?‘一捕获映射产生的实例方法的调用定义前通知膳《取当前线程的实例通过实例开启事务’第三章节已经讨论了在类中实现有关事务处理的方法其中方法封装开启具体实现细节确保一个数据库连接中同一时刻只能开启一个事务。www.docin.com北京交通大学硕士学位论文第四章的应用与实现关闭数据库连接、结束事务方面编程本文设计的方案中关闭数据库连接、回滚事务、提交事务的横切业务逻辑都在中定义如下静态方法封装对其的调用进行实现关闭数据库连接朦取当前线程的实例朕闭数据库连接提交事务代码省略回滚事务代码省略后面两个方法省去了具体实现这些方法供方面的通知体调用切入核心业务中。该方面需要捕获的连接点从包外对中的方法的调用由于所有的类都是在包下对业务方法捕获将很容易如示例代码。由于包含事务处理需要对业务方法进行异常捕获从而决定是提交事务还是回滚事务因此定义周围通知。定义方面示例代码如下定义切入点’。匹配包下所有类公有方法的调用一’限定在包外的连接点定义周围通知肌同用核心业务方法类的业务方法腱交事务回滚事务关闭数据库连接’www.docin.com北京交通大学硕士学位论文第四章的应用与实现对与关闭数据库连接的切入点考虑到控制层在一次用户请求中可能需要调用多个业务层的业务方法在有些项目中会推迟一些可能在出控制层时才关闭数据库连接避免实例频繁地创建和销毁。由于采用面向方面编程这个修改将变得非常容易直接修改该方面就可以实现而不用对核心业务代码做任何修改充分体现了面向方面编程分离横切关注点的优势。缓存横切关注点切入点分析在包内定义工具类实现读取系统中相对静态的信息由于这些信息读取比较频繁对这些信息进行缓存可以减少数据库访问次数提高系统性能。因此缓存是这个包内所有公有方法的一个重要横切关注点。缓存的切入点所要捕获的连接点就是包内所有公有方法的执行在该连接点处将方法执行结果缓存起来当下一次发生同样的调用时可以直接返回缓存结果。在前面设计实现中都是使用捕获对特定方法调用连接点这些方法主要集中在业务层和数据层如图所示业务层和数据层的方法与页面显示层不存在直接的调用关系而页面可以直接调用工具类方法如果仍然使用进行捕捉他们的调用将会失败当前服务器如、都是对即时编译它们直接使用标准的编译器编译页面生成的字节码的类文件。因此的编译器对页面中的连接点不再起作用需要使用另一关键字捕获工具类方法体中的连接点。同时工具类的方法中会存在内部互相调用的情况需要解决嵌套缓存的问题以此提高缓存效率。中关键字可以实现对循环切入的控制见节具体实现。缓存主键上下文分析如何判断是否同样的一次调用从而可以利用上一次调用时缓存的结果关键是需要获取连接点处的上下文以上下文为主键进行缓存被调用方法的执行结果就可以根据该缓存进行判断是否有被缓存过的执行结果可直接被重用。工具类的公有方法都是定义静态的因此该上下文主要有方法名含包名和类名、实参列表。在通知中提供的关键字中有两个方法www.docin.com北京交通大学硕士学位论文第四章的应用与实现暑分别可以获得这些上下文。以方法名和实参列表为主键在缓存中存储这些公用静态方法的执行结果缓存数据结构设计如下图所示图缓存数据结构图缓存由一个实例充当它的键值分别是方法名和一个实例亥实例存放的键值对是实参的特征值与被调用方法的执行结果。实参的特征值通过递归组合每一个实参的哈希码计算得到这种算法与重载类时的方法的算法类似。具体算法如下’www.docin.com北京交通大学硕士学位论文第四章的应用与实现否图组合算法基于这种数据结构设计的缓存同时也需要提供一些取值和设值的操作定义类封装缓存数据及其相应的操作缓存类中提供的方法主要有获取缓存数据判断是否已缓存和缓存调用结果。类图如下www.docin.com北京交通大学硕士学位论文第四章的应用与实现越埘定义埋存∞醴印◆氓往哈根据方法名和安’列衰获取援存中的教撼’№硪鲥删膪喇叼啪四∥根据方法名和参敛列衰爿断是否已作垤存嘲报撼方法名和参数列衰援存调用结摹脯窑埋存图类缓存方面实现以上分析了方面实现的的切入点和上下文以及缓存数据结构设计实现缓存方面的代码如下定义切入点’埘’’定义周匿通知利用关键字防止嵌套缓存。蕨取上下文方法名。场【】威取上下文实参列表∥从缓存中获取数据脚果已经缓存直接返回缓存的结果月用核心方面工具类方法将运行结果存入缓存区回运行结果该方面在程序上实现了缓存逻辑与工具类中的一些具体业务逻辑编码完全分离程序编译之后将会向包内所有工具类的方法织入缓存逻辑。缓存的信息是相对静态的也会有修改的时候因此需要考虑数据同步的问题由于这些信息通常都是由系统的管理员进行维护本文在设计缓存类的时候提供了方法可以供管理员从前台发送请求调用清空所有的缓存保www.docin.com北京交通大学硕士学位论文第四章的应用与实现证数据同步。这种做法在实际项目实施中取得了较好的效果。缓存设计实现还有很多工作需要做清空所有缓存实现数据同步并不是很理想应该由程序自动判断缓存中不同步的数据只清空这部分缓存即可另外还应该对缓存内容的使用情况进行监视设定合适时间内如果缓存内容没有被再次使用就可以清除该部分缓存以节省存储空间。本文在此不做进一步分析了。权限认证控制层的权限认证采用基于角色的访问控制方法它是目前公认解决大型企业的统一资源访问控制的有效方法。其显著的两大特征是减小授权管理的复杂性降低管理开销。灵活地支持企业的安全策略并针对企业的变化有很大的伸缩性。数据库结构设计权限认证主要有三张表用户表、角色表、资源表。用户表记录系统中所有用户基本信息主要字段为用户、用户名、密码等。资源表记录控制层所有控制方法信息每一条记录对应类中的一个控制方法主要字段资源、资源名称等角色表根据不同用户类型定义各种角色主要字段角色角色名称等。每一个用户可以对应多个角色一个角色可以拥有多个资源权限用户与资源不发生直接关系通过角色关联自己可以访问的资源用户表与角色表、角色表与资源表都是多对多的关系关系图如下www.docin.com北京交通大学硕士学位论文第四章的应用与实现图基于角色权限设计表关系图基于角色权限设计方案根据实际需要还可以加入群表该表的记录可以与实际应用系统中用户所在的部门组织相对应可以实现批量为用户分配角色。权限控制逻辑详细实现不是本文的重点本节旨在实现如何运用模式分离具体业务逻辑和权限控制逻辑。权限上下文分析客户端请求提交给控制层在控制方法体中处理请求、调用具体业务逻辑之前都需要进行权限认证前文已经分析了权限认证逻辑实现通过模式分离出来单独实现需要在切入控制方法体时获取控制方法信息使其对应到资源表中的某一条记录本文设计的方案就是通过的关键字获取控制方法的全称包名类名方法名控制方法都是不带参数的而资源表的资源字段直接取值为方法的全称。具体实现权限部分数据信息相对于具体的业务数据信息来说是相对较为静态的在节设计的类增加方法调用层的业务方法∥判断某个角色是否具备访问该控制方法的权限在节中我们已经实现了为所有类中的方法切入了缓存业务逻www.docin.com北京交通大学硕士学位论文第四章的应用与实现辑这样可以减少权限认证逻辑对数据库的访问。在用户登陆系统之后中保存用户所拥有的角色用户从客户端提交请求到中的方法切入权限认证逻辑实现代码如下定义切入点捕获所有地控制方法胴浃取上下文空制类中方法的全称从中获得用户的角色信息调用。进行权限认证
一旦权限认证不通过核心业务就会被横切方面拦截抛出异常转向登陆的页面。www.docin.com北京交通大学硕士学位论文第五章基于模式的系统特点分析第五章基于模式的系统特点分析在第三章本文给出了一种系统多层架构设计分析了各层需要切入的横切关注点第四章针对这些横切关注点已经设计实现了基于的解决方案。基于这种模式的系统与传统的纯模式的系统相比有了很大的改进采用纯模式设计的系统各个横切面业务逻辑与核心业务逻辑都纠结在一起相同代码片段分散在程序中多处。以业务层流程顺序为例如图图面向对象的业务层顺序图从图中可以看出业务层类的方法除了实现核心业务逻辑以外还需要显式地包含对辅助业务数据库连接、事务处理等相关代码的调用这种纯的实现模式使得业务方法越多将会导致类似代码片段越多的分散。而基于本文
面向方面的设计实现方案完全分离出了横切方面单独实现横切业务逻辑利用横切机制对所有的业务方法统一切入横切方面业务逻辑自动组合实现完整的业务流程。横切业务核心业务完全处在两个不同的方向上实现了彻底的解耦避免代码纠结。基于模式设计的本文方案业务层流程如图所示www.docin.com北京交通大学硕士学位论文第五章基于模式的系统特点分析翌罂』库连接、’翌罂库连接心业务方法图面向方面的业务层顺序图图和图的对比来看较从一个更高的思想层次构建系统模式实现更加自然、简单更易于理解。的优势总的来说基于模式的系统相比传统的模式优越性主要体现在以下几个方面耦合性将系统分为两个方面核心关注点和横切关注点从一个更高的层次对系统做了分解实现了核心业务与横切业务的完全解耦将类中实现细节的共同部
分抽离出来封装在方面中单独进行实现具备更好的模块化。以数据库连接维
护方面实现为例在业务层与控制层完全不再关心数据连接的获取和关闭在方面的通知中定义了数据连接获取和关闭与核一业务执行的切入关系实现了任何时候在控制层中调有模型层业务方法都会自动切入数据库连接维护相关操作但是在编码实现上又是完全分离在方面中不仅封装了横切业务逻辑的www.docin.com北京交通大学硕士学位论文第五章基于模式的系统特点分析实现而且也封装了核心业务逻辑对横切业务逻辑的调用使两者的耦合性大大降低。在本文的设计方案中虽然利用加入了各种实现横切关注点的代码但仍然保持核心业务多层架构特点横切关注点方面的实现对于核心关注点方面完全透明整个系统实现了更高层次的解耦。可读性分离出横切方面的业务逻辑之后使程序开发人员可以专注核心业务编程不再受横切业务方面的干扰不仅减轻了开发负担还可以编写更加简洁的核心业务代码具备更好可读性。以事务处理为例传统的实现都需要程序员对自己开发每一个业务模块进行操作决定是否事务回滚或事务提交操作增加了程序开发人员的负担同时大量的非核心业务代码影响了人们对程序的阅
读和理解。而一旦将这些放在方面中实现核心业务模块化大大加强核心方面业务代码将不再与非核心业务代码纠结在一起实现起来更加容易清晰。可扩展性可扩展性是思想一个最大的特色它为系统提供了一个新的扩展机制可以非常容易地在不修改已有代码的基础上实现系统功能的扩展。方面可以在程序任何连接点处注入需要扩展的功能逻辑只需要增加有关方面代码的实现即可这样可以推迟很多传统设计上的决定。在此以性能监控功能为例在一个系统部署运行初期通常都需要监控各个业务方法的执行性能情况传统的实现方式可能
需要在各个业务方法前后手动插入一些代码目的达到之后为了避免对性能的影响又需要手动删除这样的做法对于一个大型系统是难以忍受的。但是利用就非常容易实现该功能的插拔定义以下方面即可定义周围通知””www.docin.com北京交通大学硕士学位论文第五章基于模式的系统特点分析在该方面的定义中重用了在关闭数据库连接方面定义的切入点捕获所有业务方的代用执行在其前后切入性能监控相关代码。整个实现非常简单。就像是在原有系统中只增加一个新类而已而且不用对原有代码作任何修改。系统中很多需要扩展的功能都可以通过这种方式实现。良好的可扩展性同时也具备良好的可维护性面向方面编程将所有的横切关注点集中实现和调用更加方便对横切业务的维护。基于模式系统设计开发的不足作为一种新的编程思想模式在进行系统设计开发的时候也存在一些不足的地方本文设计方案采用语言在环境下进行实验不足之处主要体现在以下几个方面的开源社区已经提供的插件在可视化设计和代码辅助上做了很大的支持但是仍然存在不足特别是可视化在准确性和可用性上有些欠缺。另外缺乏对横切业务实现代码跟踪调试的支持。当前各种主流的服务器缺乏对支持。利用语言在开发环境下编译后的字节代码在现有的服务器运行可以不需要专有编译器支持但在系统中所有页面都是利用标准的编译器即时编译要想捕获页面上的连接点就无法实现因此存在一定的局限性。基于面向对象语言扩展的实现原理编译器在源程序编译生成字节码之前会对源程序作一些横切织入修改因此对方面织入的做任何修改相关涉及的类都需要重新编译对系统部署造成一些麻烦。对编码风格和编码习惯的限制在编程中很重要的一点是如何定义切入点精确捕获所有连接点为了使定义切入点更加容易要求面向对象编程具备统一编程风格甚至需要强制些良好编程习惯如本文设计方案中对各层代码所在的包路径都做了严格的限制这样才容易根据包路径的特征在不同的层中切入不同的横切业务。定义切入点的时候大多数都需要根据对方法名的特征匹配从而捕获连接点因此对系统的代码包的组织结构和调用关系都提出了强制性的要求例如在页面www.docin.com北京交通大学硕士学位论文第五章基于模式的系统特点分析中就不能直接调用业务层的类的方法否则由于页面中没有切入一些必要的横切业务数据库连接不会主动关闭事务结束也得不到处理从而导致出错强制要求类的业务方法只能在控制层等地方被调用程序才能正确执行。另外并不支持对利用反射机制进行方法调用的捕获因此试图利用反射机制调用类的业务方法也会导致同样的错误。相对于面向对象编程面向方面编程的确带来了更多的代码编写限制但是这种限制也有利于帮助我们开发出程序结构、代码风格更加良好的系统正如的作者所言方面可以用于维护一个类的几个方法之间的内在一致性它非常适合强制一种按契约进行设计的编程风格可以用于强制各种常见的编码习惯。作为一种基于语言的扩展语言虽然存在着一些固有的缺点但是总的来说目前它还是功能最强大、使用最方便的具。面向方面编程最佳实践语言作为当前语言事实上的规范使用灵活功能强大更方便体现面向方面编程思想使面向方面编程更加自然。结合本文的实验体会提出以下最佳实践条款尽可能为一些具有相同性质的类定义简单的父类父类最好定义为抽象类或者接口这样可以非常方便根据父类对这些类中的连接点捕获。如本文设计方案中对所有的业务对象类定义了父类。让业务层与控制层、数据层彻底分离保持单向的调用关系防止各层之间出现循环调用关系。例如一分开。各层都对其他层隐藏本层的具体实现。禁止在和中实现业务逻辑。可以使用模式来降低代码的耦合度在横切关注点与核心关注点之间传递上下文因为绝大多数用户的一次请求都是在同一个线程中完成尽可能在程序开发中严格遵循这一点否则需要作特殊处理造成一些麻烦。不要试图用关键字捕获页面中对方法进行调用的连接点当前的服务器尚不支持只会导致失败。变通的方法可以采用关键字切入被调用方法体内部捕获方法的执行。页面中减少对后台业务方法的直接调用尽可能的从对象中获www.docin.com北京交通大学硕士学位论文第五章基于模式的系统特点分析取数据。在本文设计方案中强制禁止页面直接调用类的方法但可以调用业务层中工具类方法。各种标志符的命名遵循一些约定俗成的习惯包括方法名、包名、类名、属性名等命名。这样方便于利用专有的通配符根据这些命名特征进行匹配从而更加容易捕获连接点。例如所有的实例的方法都以“”为前缀这样就可以很容易定义切入点切入对象持久化方面的横切业务。www.docin.com北京交通大学硕士学位论文结论结论总结本文对设计与开发做了积极地探索和研究。介绍了的主要概念横切面、切入点、方面等探讨了有关技术实现原理和设计开发理论结合系统的特点设计了一种基于的系统的架构重点研究了在系统中的应用针对系统具有共性的横切关注点对象持久化、数据库连接维护、缓存和权限认证设计实现了基于的解决方案。从中我们可以看出相比传统面向对象编程模式的优越性主要体现在以下三方面减少核心关注点业务开发人员的负担使他们可以专注商业业务逻辑的开发提高开发效率。同时有助于团队成员之间分工协作由于核心关注点和横切关注点的彻底分离团队成员可以分别专注于这两方面开发互相影响大大减小有效发挥团队力量。有效解决了模式下面临“横切”问题时的代码混乱使系统进一步解耦增强了系统的可读性、可维护性和可扩展性利用可以在不修改系统核心方面代码的基础上只需增加“横切面”就可以很容易实现系统功能的扩展。不仅很好的解决系统中已有横切关注点与核心关注点的分离也为以后系统增加新的横切关注点扩展新的功能提供了更大空间同时对已实现横切功能维护变得非常独立。从单一的层次方向构建系统而增加了横切面方向从一个更高的层次构建系统更自然地将系统需求分析映射到编程模式更加方便人们对系统的设计、开发和理解。进一步工作作为一种新的编程模式仍然处在不断发展和完善之中当前设计、开发、测试理论仍然相当缺乏在业界缺乏统一的规范甚至还存在对它的种种争论在实际应用中尚未出现真正的语言。在一个新的编程思想没有成熟之
前将更加吸引着人们对这些问题的探讨和研究。在理论和实践应用方面都www.docin.com北京交通大学硕士学位论文结论有待进一步的探讨研究实践应用中加强在具体商业业务领域的运用目前大多数的应用仍然局限于解决一些系统级横切关注点问题需要扩大的应用领域在应用中不断总结经验发现的规律充实相关开发理论。目前不管是基于动态代理机制实现的框架还是基于面向对象语言的扩展都不同程度上存在着一些不足期待着更好的语言。同时思想的实际运用也需要更好的集成开发工具支持加强代码辅助、可视化、跟踪调试等功能。分析设计相关理论需要不断发展基于的需求分析和系统设计的理论方法都非常欠缺对相关概念和思想很多在业界仍未形成共识。最后引用的话结束本文“方面仍然呆在这里。它们仍然没有成为主流应用程序一部分的一个方法但它们每一天都变得更加接近”。www.docin.com北京交通大学硕士学位论文参考文献参考文献【】陶刚编译‘体验中面向方面编程》时却年月【】著∞【】年月【】陈景燕阳国贵著下的权限控制实现》时】年月【】著技术简介》】年月【著冯博琴等译‘面向对象分析与设计》【】北京机械工业出版社年月【】张海潘编著‘软件工程导论》【】北京清华大学出版社年月【】∞【】年月【】下的编写的应用》【【‘用动态代理实现【】【著精通构建与部署应用的最佳策略》瞰】北京电子工业出版社【著潘爱民译口哪北京机械工业出版社年月【】古全友王恩波胥昌胜技术在系统构建中的应用》【】计算机技术与发展第卷第期年月【】著个最重要的最佳实践》【】年月【孙卫琴编著《精通对象持久化技术详解》川电子工业出版社年月【格雷德斯基著‘精通【】清华大学出版社年月【著龚波冯军程群梅等译设计模式手册》【】机械工业出版社年月【李清华著‘基于的系统实现研究》武汉大学硕士学位论文年月【】范武苏一‘基于编织技术的缓存框架研究和实现》【】软件导刊年期【∞著‘www.docin.com——一韭至至望查差堡圭竺垡笙兰堡查兰坚》【】电子工业出版社年月】埘删著》】
【?【】“【咖【】【美詹森美赫鲁著译∞删㈣》中文版【电子工业出版社年月【著》【年月【著阱】年月【著》【】北京机械工业出版社年月著【北京机械工业出版社【】》】年月www.docin.com北京交通大学硕士学位论文作者简历作者简历教育经历年月一至今就读于北京交通大学软件学院计算机软件与理论专业软件工程方向攻读硕士学位年月一年月就读于华中师范教育技术学专业计算机辅助教育方向获理学学士学位工作实习经历年月一年月实习于北京合力金桥软件技术有限责任公司职位工程师年月一年月兼职于长城企业战略咨询研究所职位工程师年月年月任教于九江学院主讲课程语言程序设计。主要工程项目年月一年月参与中国网通客户关系管理》主要技术框架主要职责网管数据交换接口、用户数据同步接口和统一审批固化模块的设计与开发。年月一年月参与‘中学生心理健康测试系统》主要的技术框架包括的、、等功能、本人承担的主要工作一些特殊问卷测试、数据统计分析、系统配置模块、自定义问卷发布等模块的数据库设计与开发以及一些通用代码的编写。本人的工作量占整个项目三分之一以上年月年月个人承接《国家软件专业孵化器技术支持中心北交大分中心》的设计与开发。本人主要工作数据库设计、系统架构除论坛和美工以外几乎所有功能模块设计开发实现各个中心之间的注册用户的单点等录部分编码。论文发表情况‘面向方面编程在多层架构中业务层的应用》发表于《计算机技术与发展》年第期《基于多层架构中层对数据库访问的优化》发表于《铁路计算机应用》年第期www.docin.com北京交通大学硕士学位论文独创性声明独创性声明本人声明所呈交的学位论文是本人在导师指导下进行的研究工作和取得的研究成果除了文中特别加以标注和致谢之处外论文中不包含其他人已经发表或撰写过的研究成果也不包含为获得北京交通大学或其他教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。学位论文作者签名弋包簪罕签字日期。一口年月仁日www.docin.com学位论文版权使用授权书本学位论文作者完全了解北京交通大学有关保留、使用学位论文的规定。特授权北京交通大学可以将学位论文的全部或部分内容编入有关数据库进行检索并
采用影印、缩印或扫描等复制手段保存、汇编以供查阅和借阅。同意学校向国家有关部门或机构送交论文的复印件和磁盘。保密的学位论文在解密后适用本授权说明学位论文作者签名眵晖签字日期年月日新签名嬲签字日期仞彩年日www.docin.com

转载于:https://www.cnblogs.com/wangzhongming/p/7052745.html

YJ智能框架--面向对象方面编程相关推荐

  1. 《C++面向对象高效编程(第2版)》——2.16 识别成员函数的目标对象

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第2章,第2.26节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  2. Python学习笔记:面向对象高级编程(完)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. Python学习笔记:面向对象高级编程(上)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. c++面向对象高级编程 总目录

    本文是对学习侯捷视频 c++面向对象高级编程系列博客的目录总索引. c++面向对象高级编程 学习一 不带指针的类: 访问私有成员变量的方式,内联inline,常量成员函数,构造函数,值传递,引用传递, ...

  5. Java开发人员可以从Spring框架中学到编程技巧

    毫无疑问,Spring Framework是最受欢迎的Java框架之一,通过提供依赖注入和控制反转等特性,可以轻松创建真实的企业级Java应用程序.但是,Spring不仅是一个DI和IOC框架.通过提 ...

  6. 一、C++面向对象高级编程(下) (侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...

  7. 03 - 程序设计框架:裸机编程中应用层、中间层、驱动层划分

    03-程序设计框架:裸机编程中应用层.中间层.驱动层划分 1.框架设计层次 <代码大全>第五章中,把程序设计分为四个层次: 软件系统,就是整个系统.整个程序 分解为子系统或包.比如我们可以 ...

  8. 【C++】侯捷C++面向对象高级编程(上)

    C++面向对象高级编程 前言 C++ Programs代码基本形式 文件类型 头文件写法 头文件布局 class1--complex 类的声明 inline--内联函数 class访问级别(acces ...

  9. 侯捷C++课程笔记01: 面向对象高级编程(上)

    本笔记根据侯捷老师的课程整理而来:C++面向对象高级编程(上) pdf版本笔记的下载地址: 笔记01_面向对象高级编程(上),排版更美观一点(访问密码:3834) 侯捷C++课程笔记01: 面向对象高 ...

最新文章

  1. 我的linux Mint之路(三)
  2. VB6+Winsock编写的websocket服务端
  3. 卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)
  4. oracle数据库常用关键字以及写法
  5. java——获取视频某一帧的图片
  6. java 正则 关键字_正则表达式关键字
  7. ubuntu 开机后不动_Ubuntu启动时停止的问题
  8. Android:adb 详细介绍
  9. SoundPool的sample 1 not READY问题
  10. Linux虚拟内存那点事儿
  11. GitLab 创建项目组及将代码导入项目
  12. tof传感器有什么用 tof传感器原理「手机百科」
  13. android音乐全资源软件,安卓无损音乐下载工具合集 — 长期更新页
  14. 条形码类型及常见条形码
  15. 皮尔逊相关系数实现相似K线及其性能优化
  16. 粤通院 招聘FPGA工程师
  17. sklearn线性回归,支持向量机SVR回归,随机森林回归,神经网络回归参数解释及示例
  18. CH340 +Micro USB转串口 不能识别 不起振问题
  19. git 合并分支(开发分支dev合并到主分支master)
  20. 晒一下图标(自娱自乐)

热门文章

  1. 建成 5000 多间「梦想中心」后,他们决定将技术开源
  2. 热爱工作,拥抱明天——读《干法》有感2800字
  3. 中心透视投影和鱼眼投影的区别(Central perspective projection vs. fisheye projection)
  4. 三极管和MOS管的应用与区别
  5. ios 判断手机角度_iOS 角度获取及旋转
  6. BZOJ 1565 [NOI2009]植物大战僵尸
  7. 阿里巴巴三面总结,讲一讲从P5到P8需要掌握的知识点,本人已成功入职。
  8. 我是程序员,如假包换——如何用一句话证明你是程序员?
  9. 哪家科技巨头的人工智能最先觉醒:谷歌、Facebook、还是特斯拉?
  10. hanlp分词学习笔记