资源描述
AOP,(,面向方面的编程,)技术,在本讲您能了解如下内容,AOP,技术概述,AOP,中的关注点,AOP,是,OOP,的扩展技术,AOP,的具体用途,为什么要提供,AOP,利用,AOP,能够更好地满足,OCP,原则,1,、面向方面的编程,(,AOP-Aspect-Oriented Programming,),(,1,)什么是,Aspect,?,中文直译通常是“方面”(更准确的应该为“切面”),但这个名词容易使人混淆或者太抽象。,它其实是一种编程技术,(,2,)应用,AOP,的主要目的,-,尽量分离“技术问题实现”和“业务问题实现”,它允许开发者能够对横切关注点进行模块化设计,-“,切面”的意义在于将业务逻辑中复杂问题分离成不同层面,使其实现统一集中的管理。,能够实现分散关注,将通用需求功能从不相关类之中分离出来。这样将能够更好地遵守“单一职责”原则;,同时,能够实现代码重用。一旦行为发生变化,不必修改很多类,只要修改共享的类。,您理解其内涵吗?,您觉得抽象难懂吗?请继续,2,、,AOP,技术起源,(,1,),OOP,技术的简要回顾,开发者可以用一组对象以及这些对象之间的关系将软件系统形象地表示出来,-,利用,OOP,能够更好地对系统进行抽象和描述,在设计规模大、逻辑复杂的系统时,开发周期反而能变的更短,请见文档中的说明,(,2,)面向对象设计的主要问题是,它本质是静态和封闭的,静态的,-,很难达到动态地添加新的功能方法,封闭的,-,任何需求的细微变化都可能需要对原有的类继续修改,从而对开发进度造成重大影响。,(,3,)利用设计模式进一步完善,OOP,解决,OOP,所面临的问题一个常用的方法是应用设计模式,应用设计模式所体现出的优点,-,设计出灵活、可扩展、可重用的类库、组件,乃至于整个系统的架构,比如在,GOF,中提供“装饰器模式”来达到动态地添加新的功能方法,希望大家有时间系统地掌握“,GOF”,设计模式和,J2EE,核心设计模式!,(,4,)应用设计模式同样所面临的问题,然而鉴于对象封装的特殊性,“设计模式”的触角始终在接口与抽象中大做文章,而对于对象内部则无能为力。,比如在,GOF,中强调“面向接口”编程也就是希望我们的系统能够有更好的灵活性和可扩展性,-,分离“变化”和“不变”部分,这样在一定的程度上能够“适应变化”。,因为,我们希望能够,动态地调整对象的内部结构,!同时也能够对对象中的,方法执行过程能够控制,-,比如,能够拦截某方法,从而允许在方法执行之前或者执行以后,能够做点其它的事情!,OOP,的“静态”特性很难达到此目的!,(,5,),AOP,技术的产生,早在,1990,年开始,来自,Xerox Palo Alto Research Lab,(即,PARC,)的研究人员就对面向对象思想的局限性进行了分析,随着研究的逐渐深入,,AOP,也逐渐发展成一套完整的程序设计思想,各种应用,AOP,的技术也应运而生。,3,、,AOP,是什么样的编程方法,(,1,)首先了解什么是“分离关注”,所谓的分离关注就是将某一通用的需求功能从不相关的类中分离出来,同时能够使得很多类共享该通用的需求实现,-,一旦该实现发生变化,只要修改这个“实现”就可以而不影响其它主功能实现。,(,2,),AOP,就是这种实现分散关注的编程方法,它可以解决,OOP,和过程化方法不能够很好解决的横切(,crosscut,)问题,(,3,)横切问题主要是指,系统中的下面的各个方面的技术实现,:事务、安全、日志、并发锁等横切关注。,当未来系统变得越来越复杂,横切关注点就成为一个大问题的时候,,AOP,就可以很轻松的解决横切关注点这个问题。,(,4,),AOP,实际是,GoF,设计模式的一种扩展,设计模式所追求的是降低代码之间的耦合度,-,设计模式孜孜不倦,追求的是调用者和被调用者之间的解耦,,增加程序的灵活性和可重用性,AOP,实际上就是设计模式所追求的目标的一种实现或者说,AOP,实际是,GoF,设计模式的延续,-,分离“系统核心”和“外围功能”的各自实现。,您了解,GOF,及,J2EE,核心模式吗,4,、,AOP,主要是把系统作为一批关注点来实现,(,1,)应用系统是由大量的关注点所构成的,比如,持久化、系统安全、日志记录、应用的业务逻辑通常被认为是应用需要解决的问题。因此,他们通常作为各自的关注点被看待和被处理。,而从整个系统角度考虑,一个系统往往是由大量的关注点构成的。,(,2,)我们需要整理和分离系统的各个关注点,(,3,)应用系统中的常见的各个关注点,-,通过分层能够更好地隔离各个关注点,您了解为什么要这样吗,5,、,AOP,是,OOP,的一种扩展技术,OOP,与,AOP,相互配合,-,它们应该相互配合,而不是相互排斥,(,1,),AOP,和,OOP,在应用上的不同点,AOP,是针对具体业务领域中的“技术逻辑”的实现;,而,OOP,针对业务对象及其关系、业务逻辑的处理。,(,2,),OOP,擅长解决纵向方面的问题,因为,OOP,允许我们定义从上到下的关系(纵向),但并不适合定义从左到右的关系(横向),OOP,在实现对公共行为进行建模时,展示了强大的功能,但利用它对跨越多个模块的共性的“行为”进行建模时,,OOP,则显得无能为力。,(,3,),OOP,不擅长解决横向方面的问题,OOP,在通常的场合下工作得很好,但在特定的领域里却有所欠缺:举例来说,如果我们必须为多个对象和方法应用相同的事务行为,我们需要将同样的代码剪切,/,粘贴到每一个方法里。,AOP,让我们可以把这类问题封装到方面(,aspect,)中,从而更好地实现模块化。,实现系统的关注点,该单一维度一般是核心需求和关注点的模块化实现,其他类型的需求也被迫和该主导维度一致。,由于问题空间是,n,维的,而解空间是一维的。这种失配必然导致需求和实现之间的失配。,目前的实现技术只提供了一维方法学(继承和接口实现),6,、如何解决横向方面的问题,(,1,)我们的目标是要避免横切(,cross-cutting,)代码散布在程序的各处,例如日志功能,日志代码往往水平地散布在所有对象层次中,-,在控制层、业务层和数据访问层都需要日志功能,并且而与它所散布到的对象的核心功能毫无关系。,对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。,这种散布在各处的无关的代码被称为横切(,cross-cutting,)代码,在,OOP,设计中,它导致了大量代码的重复,而不利于各个模块的重用。,(,2,),DRY,原则(,Dont Repeat Yourself,不要书写重复的代码),(,3,)面向方面编程提供从另一个角度来考虑程序结构以完善面向对象编程(,OOP,),如上图,直接调用代码段与采用拦截器相比唯一不同的是:如果不是用拦截器,代码中需要显示通过代码来调用目标方法。但在使用拦截器的情况下,则由系统自动完成该方法的调用。通过这种对比不能难发现,拦截器的使用优势在于提供了更高层次的解耦,目标代码无需手动调用目标方法。,7,、,AOP,的典型具体用途,(,1,),AOP,可以很轻松地解决横切关注点这类问题,它可以解决,OOP,和过程化方法不能够很好解决的横切面(,crosscut,)的问题,如:事务、安全、日志等横切关注。,当未来系统变得越来越复杂,横切关注点就成为一个主要问题的时候,,AOP,就可以很轻松的解决横切关注点这个问题。,AOP,技术利用一种称为“横切”的技术,剖解开封装的对象内部,-AOP,将程序分解成各个方面或者说关注点,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“,Aspect”,(,2,)为什么,AOP,能够解决横切关注点这类问题,(,3,)横向切面的说明示例,日志处理技术,事务管理技术,我们主要应用,AOP,的拦截(,interception,)能力,-,它为我们提供了“在任何对象的方法调用前,/,后加入自定义行为”的能力,这使得我们可以很方便地处理企业应用中的横切关注点方面的问题,(,4,)通常,我们可以在如下情景中使用,AOP,技术,(,5,),AOP,把软件系统分为两个部分:核心关注点和横切关注点,为什么要这样划分,按照,AOP,的思想,主逻辑的开发人员在写代码的时候不应该考虑边缘逻辑,您了解什么是分散关注?将通用需求功能从不相关类之中分离出来,(,1,),AOP,可以防止代码混乱,并产生模块化的功能程序,8,、为什么要提供,AOP,您知道,何谓分散关注?为什么要分散关注?,(,2,)如果不使用横切技术,软件开发是怎样的情形呢?,在传统的程序中,由于横切行为的实现是分散的,开发人员很难对这些行为进行逻辑上的实现或更改,使用,AOP,,我们可以将处理,aspect,(“切面”)的代码注入到主功能程序中,通常主功能程序的主要目的并不在于处理这些,aspect,。,更改一个应用程序的日志记录策略可能涉及数百次编辑,-,即使可行,这也是个令人头疼的任务,对“横切关注点”的常规的解决方法,-,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和维护。,请见文档中的说明,(,3,)常规的,OO,在这些应用中所面临的问题,不清晰的业务逻辑,从某种意义上来说,权限校验过程并不是业务逻辑执行的一部分,这个工作是属于系统的。但是,在常规的实现中,我们不得不把系统的权限校验过程和业务逻辑执行过程掺杂在一起,造成代码的混乱。,代码重复,使用这种方法,我们必须在所有的业务逻辑代码中用应用,Security,类,使得同样校验的代码充斥在整个软件中,显然不是很好的现象。,紧耦合,使用这种方法,我们必须在业务逻辑代码中显式引用,Security,类,这就造成了业务逻辑代码同,Security,类的紧耦合。,这意味着,当,Security,发生变化时,例如,当系统升级时,需要对,CheckRight,的方法进行扩展改动时,可能会影响到所有引用代码。,不易扩展,在这里,我们只是在业务逻辑中添加了权限校验,哪一天,当我们需要添加额外的功能,例如日志记录功能的时候,我们不得不同样在所有的业务逻辑代码中添加该功能,AOP,与常见的代理模式的不同应用示例请见文档说明,-,复杂、难懂!,(,4,)因此,应该是,OOP,与,AOP,相互配合,-,它们应该相互配合,而不是相互排斥!,面向对象的程序设计的手段是继承、封装和多态性,而面向方面的程序设计的组件是通知监听器(,advice/interceptor,)、引入(,introduction,)、元数据(,metadata,)和切入点(,pointcut,)。,(,5,)如何利用,AOP,进行开发,您知道为,什么要区分,J2EE,容器和,J2EE,应用系统吗,(,2,)利用,AOP,不仅可以分离也可以组合不同的功能模块,松散耦合,-AOP Weaver,9,、利用,AOP,能够更好地满足,OCP,原则,(,1,)使用,AOP,能够松散组合不同的业务逻辑模块,(,2,),AOP,的思想在,J2EE,平台中的具体应用,-Web,技术中的,Filter,组件的应用,在某些开发中,我们可能使用过滤器来完成某些,AOP,功能,借助过滤器所带来的好处,-,实现“业务逻辑”同“技术实现”的分离,其实,J2EE,规范中对容器的要求,也是,AOP,思想的应用,您知道,Filter,在应用时有什么限制吗?,1,、子曰:“学而不思则罔,思而不学则殆。”,“学而时习之”,2,、,子曰:“知之者不如好之者,好之者不如乐之者”,3,、子曰:“三人行,必有我师焉”,4,、,子曰:“我非生而知之者,好古,敏以求之者也”,本讲的简要回顾,
展开阅读全文