




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向切面编程:Aspect Oriented ProgrammingAOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 切面(Aspect) Aspect是你要实现的交叉功能,它是你应用中正在模块化的一个方面(aspect)。比较通用的一个例子是日志。记录日志是一项贯穿整个应用的服务。由于应用基本以功能(基于业务逻辑)为界限进行划分模块,故通过继承的方法来重用日志模块似乎不合理。但是,你可以创建一个日志aspect来实现你的想法。 连接点(Joinpoint) Joinpoint是在应用运行中那些aspect可以插进来的点。这个点可能是一个被调用的方法,一个被抛出的异常,甚至可以是一个被改变的字段。切面代码在这些地方插入到你的应用流程中,就可以为你的应用增加一些新的行为。 通知(Advice) 通知切面的实际实现。它通知应用系统新的行为。在日志例子中,日志通知包含了实现实际日志功能的代码,如向日志文件写日志。通知在连接点插入到应用系统中。 切入点(Pointcut) Pointcut定义了advice应该被插入到什么样的joinpoint点上。Advice可以被应用到任意AOP框架支持的joinpoint上。当然,你不会希望将所有的aspect应用到可以被应用的joinpoint上面。Pointcut让你可以指定advice应用的位置。通常,你用具体的类名或方法名,或者一些符合表达式的类或方法名来指定pointcut。 一些AOP框架允许你创建动态的pointcuts,这些pointcuts可以在运行的时候动态决定是否需要应用advice,比如方法的参数值。 引入(Introduction) Introduction可以让你添加方法和属性到已经存在的类中。例如,你可以创建一个稽查的advice类用来跟踪某对象最后改变的时期。这个可以简单地通过一个属性记录状态,并添加一个setLastModified(Date)方法来实现。可以在不改变已存在类的情况下将这个引入,给他们新的行为和状态。 目标对象(Target) 目标对象是被通知对象,它既可以是你编写的类也可以是你要添加定制行为的第三方类,如果没有AOP,这个类就必须要包含它的主要逻辑以及其他交叉业务逻辑。有了AOP,目标对象就可以全身心地关注主要业务,忘记应用其上的通知。 代理(Proxy) 代理是将通知应用到目标对象后创建的对象,对于客户来说,目标对象(应用AOP之前的对象)和代理对象(应用AOP之后的对象)是一样的。也就是,应用系统的其他部分不用为了支持代理对象而改变。 织入(Weaving) 织入是将切面应用到目标对象从而创建一个新的代理对象的过程。切面在制定接入点被织入到目标对象中。织入发生在目标对象生命周期的多个点上: v 编译期 - Aspects在目标类编译期被weave。这个需要特殊的编译器v 载入期 - Aspects在目标类载入期被weave。这个需要特殊的类装载器。 v 运行期 - Aspects在应用运行时的某个时期被weave。一般来说,AOP容器在weave in aspects的时候会动态创建proxy类来代理target类关键字: AOP一、AOP 概念 Joinpoint:它定义在哪里加入你的逻辑功能,对于Spring AOP,Jointpoint指的就是Method。 Advice:特定的Jointpoint处运行的代码,对于Spring AOP 来讲,有Before advice、AfterreturningAdvice、ThrowAdvice、AroundAdvice(MethodInteceptor)等。 Pointcut:一组Joinpoint,就是说一个Advice可能在多个地方织入, Aspect:这个我一直迷惑,它实际是Advice和Pointcut的组合,但是Spring AOP 中的Advisor也是这样一个东西,但是Spring中为什么叫Advisor而不叫做Aspect。 Weaving:将Aspect加入到程序代码的过程,对于Spring AOP,由ProxyFactory或者ProxyFactoryBean负责织入动作。 Target:这个很容易理解,就是需要Aspect功能的对象。 Introduction:引入,就是向对象中加入新的属性或方法,一般是一个实例一个引用对象。当然如果不引入属性或者引入的属性做了线程安全性处理或者只读属性,则一个Class一个引用也是可以的(自己理解)。Per-class lifecycle or per-instance life cycle 二、AOP 种类 1、静态织入:指在编译时期就织入Aspect代码,AspectJ好像是这样做的。 2、动态织入:在运行时期织入,Spring AOP属于动态织入,动态织入又分静动两种,静则指织入过程只在第一次调用时执行;动则指根据代码动态运行的中间状态来决定如何操作,每次调用Target的时候都执行(性能较差)。 三、Spring AOP 代理原理 Spring AOP 是使用代理来完成的,Spring 会使用下面两种方式的其中一种来创建代理: 1、JDK动态代理,特点只能代理接口,性能相对较差,需要设定一组代理接口。 2、CGLIB 代理,可代理接口和类(final method除外),性能较高(生成字节码)。 四、Spring AOP 通知类型 1、BeforeAdvice:前置通知需实现MethodBeforeAdvice,但是该接口的Parent是BeforeAdvice,致于什么用处我想可能是扩展性需求的设计吧。或者Spring未来也并不局限于Method的JoinPoint(胡乱猜测)。BeforeAdvice可以修改目标的参数,也可以通过抛出异常来阻止目标运行。 2、AfterreturningAdvice:实现AfterreturningAdvice,我们无法修改方法的返回值,但是可以通过抛出异常阻止方法运行。 3、AroundAdvice:Spring 通过实现MethodInterceptor(aopalliance)来实现包围通知,最大特点是可以修改返回值,当然它在方法前后都加入了自己的逻辑代码,因此功能异常强大。通过MethodIceed()来调用目标方法(甚至可以不调用)。 4、ThrowsAdvice:通过实现若干afterThrowing()来实现。 5、IntroductionInterceptor:Spring 的默认实现为DelegatingIntroductionInterceptor 五、Spring AOP Pointcut 以上只是Advice,如果不指定切入点,Spring 则使用所有可能的Jointpoint进行织入(当然如果你在Advice中进行方法检查除外)。因此切入点在AOP中扮演一个十分重要的角色。Spring 2.0 推荐使用AspectJ的Annocation的切入点表达式来定义切入点,或者使用来定义AOP,这方面本篇不做考虑。 1、Pointcut:它是Spring AOP Pointcut的核心,定义了getClassFilter()和getMethodMatcher()两个方法。 2、ClassFilter:定义了matches(Class cls)一个方法。 3、MethodMatcher() 定义了matches(Method,Class),isRuntime(),matches(Mathod,Class,Object)三个方法,如果isRuntime()返回true则表示为动态代理(实际是动态代理的动态代理),则调用第三个方法(每访问一次调用一次),否则调用第一个方法(并且只调用一次) 4、Spring AOP静态切入点的几个实现。 ComposablePointcut 太复杂一个切入点无法表达就用这个,union MethodMatcher和ClassFilter或者intersection MethodMatcher、ClassFilter和Pointcut。为什么不实现union Pointcut? 而只能通过Pointcuts类对Pointcut进行union操作。 ControlFlowPointcut 想对程序的运行过程进行追踪就用这个 DynamicMatchMatcherPointcut 想用动态AOP 就用这个 JdkRegexpMethodPointcut 想使用正则表达式就用这个 Perl5RegexpMethodPointcut NameMatchMethodPointcut 想用方法名字来匹配就用这个 StaticMethodMatcherPointcut 静态切入点就用这个 没有人反对你直接实现Pointcut:)。 六、Spring AOP 中的Advisor其实就是Aspect 1、PointcutAdvisor 其实一般使用DefaultPointcutAdvisor就足够了,给它Advice和Pointcut。 当然如果想少写那么几行代码也可以使用NameMatchMethodPointcutAdvisor,RegexpMethodPointcutAdvisor等。 更多Advisor可以查看API文档。 2、IntroductionAdvisor 默认实现为DefaultIntroductionAdvisor。 七、AOP ProxyFactory 使用代码实现AOP 可使用ProxyFactory 声明式AOP 可使
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医药销售人员法规与职业道德培训
- 市政排水沟施工详细方案
- 地理信息系统制度建设
- 新手销售人员客户管理培训手册
- 心理康复报告与评估标准的制定及实施研究
- 宴会预订规程
- 农村客运车辆使用规程
- 慢性高血压患者护理方案
- 服装品质检验指南
- 考研中的挑战与突破
- 国开电大《工程数学(本)》形成性考核作业5答案
- 部编版五年级上册语文教案1-6单元(表格式)
- GB/T 4798.5-2007电工电子产品应用环境条件第5部分:地面车辆使用
- GB/T 4513-2000不定形耐火材料分类
- 12YJ6 外装修标准图集
- 阅读与思考(选学)为什么要证明课件
- HPLC高效液相色谱解读课件
- 中医诊断学望诊
- DN1000顶管施工方案
- 《外科学》第七节 直肠癌
- DB32∕T 2975-2016 水运工程建设管理用表
评论
0/150
提交评论