Spring AOP技术.doc

上传人:博****1 文档编号:542886772 上传时间:2023-01-11 格式:DOC 页数:5 大小:65.51KB
返回 下载 相关 举报
Spring AOP技术.doc_第1页
第1页 / 共5页
Spring AOP技术.doc_第2页
第2页 / 共5页
Spring AOP技术.doc_第3页
第3页 / 共5页
Spring AOP技术.doc_第4页
第4页 / 共5页
Spring AOP技术.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《Spring AOP技术.doc》由会员分享,可在线阅读,更多相关《Spring AOP技术.doc(5页珍藏版)》请在金锄头文库上搜索。

1、Spring AOP技术概述1 什么是AOP在介绍Spring AOP之前,先简单介绍一下AOP的概念。AOP是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。是一种可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的技术。AOP可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理

2、和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为” Aspect”, 即方面(切面)。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么

3、面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。如果说面向对象编程是关注将需求功能划分为不同的并且相对独立、封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的话;那么面向方面编程则是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦这些功能发生变化,不必修改很多类,而只需要修改这个行为即可。1.1 AOP中的一些基本概念方面(Aspect):对横向分布在多个对象中的关注点所做的模块化。在企业应用中,事务管理就是一个典

4、型的横切关注点。连接点(Joinpoint):程序执行过程中的一个点,例如对某个方法的调用或者某个特定异常的抛出都可以称为连接点。 通知(Advice):AOP框架在某个连接点所采取的行为。通知有多种类型,包括“环绕”通知,“前置”通知和“异常”通知等,后文将对通知类型进行讨论。 切入点(Pointcut):指通知的应用条件,用于确定某个通知要被应用到哪些连接点上。AOP框架应允许让开发人员指定切入点。 引入(Introduction):向目标对象添加方法或字段的行为。目标对象(Target object):指包含连接点的对象。也称为被通知或被代理对象。AOP代理(AOP proxy):由AO

5、P框架在将通知应用于目标对象后创建的对象。 织入(Weaving):将方面进行组装,以创建一个目标对象。织入可以在编译期完成,也可以在运行时完成。横切技术:“横切”是AOP的专有名词。它是一种蕴含强大力量的相对简单的设计和编程技术,尤其是用于建立松散耦合的、可扩展的企业系统时。横切技术可以使得AOP在一个给定的编程模型中穿越既定的职责部分(比如日志记录和性能优化)的操作。横切关注点:一个关注点(concern)就是一个特定的目的,一块我们感兴趣的区域,一段我们需要的逻辑行为。从技术的角度来说,一个典型的软件系统包含一些核心的关注点和系统级的关注点。举个例子来说,一个信用卡处理系统的核心关注点是

6、借贷/存入处理,而系统级的关注点则是日志、事务完整性、授权、安全及性能问题等,许多关注点即横切关注点(crosscutting concerns)会在多个模块中出现。如果使用现有的编程方法,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和演进。AOP能够比上述方法更好地分离系统关注点,从而提供模块化的横切关注点。1.2 AOP的通知类型环绕通知(Around Advise):包围(按:即在连接点执行的前、后执行)某个连接点(如方法调用)的通知。这是功能最强大的一种通知。环绕通知允许在方法调用的前后执行自定义行为。它可以决定是让连接点继续执行,还是用自己的返回值或异常来将连接点“短路

7、”。 前置通知(Before Advise):在某个连接点执行之前执行,但是不具备阻止连接点继续执行的能力(除非它抛出异常)。 异常通知(Throws Advise):当方法(连接点)抛出异常时执行。后置通知(After returning Advise):在连接点正常执行完成后执行,例如,如果方法正常返回,没有抛出异常时,后置通知就会被执行。1.3 AOP的实现方式采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;采用静态织入的方式,引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入有关“切面”的代码2 Spring AOP技术2.1 Spring框

8、架的特点Spring框架目前如此流行,一方面的原因在于Spring提供了一套全面并且十分成熟的轻型应用程序基本框架,并且对复杂的应用开发提供了有力的支持。除此之外,从实际应用开发角度来看,Spring最大的优势在于它是从实际项目开发经验中抽取的,其提供了丰富的类库,可大大节省编码量,它是一种高效的、可高度重用的应用框架。Spring框架中目前最吸引人也是该应用框架最具特色的地方就是名为控制反转(IOC=Inverse Of Control)或者依赖注入(DI=Dependence Injection)的设计思想,这是一种相当优秀的设计思想,即“HollyWood”原则:“Dont call m

9、e ,I will call you!”。但是,仅仅凭借着这样一个单纯的设计模式并不能使得Spring如此成功,Spring最成功的地方,还是目前使用最为广泛的AOP应用,也就是Spring中基于AOP实现的业务管理机制,也正是由于这一点,使得Spring AOP成为应用框架中极其闪光的一个亮点。2.2 AOP思想在Spring框架中的体现2.2.1 事务管理对于J2EE应用程序而言,事务的处理一般有两种模式:依赖特定事务资源的事务处理与依赖容器的参数化事务管理。在这里我们略去对第一种处理方式的说明,直接对第二种方式,即依赖容器的参数化事务管理来阐述笔者的观点。对于传统的基于事务资源的事务处理

10、而言,Spring并不会产生什么影响,我们照样可以成功编写并且运行这样的代码。对于依赖容器的参数化事务管理而言,Spring则可以用来帮助实现对事务的管理。Spring属于轻量级容器,通过使用AOP来提供声明式事务管理,即可通过Spring实现基于容器的事务管理(从本质上来讲,Spring的事务管理是基于动态AOP)。2.2.2 动态代理机制Spring框架中所提供的AOP支持,是基于动态AOP机制实现的,即通过动态Proxy模式,在目标对象的方法调用前后插入相应的处理代码。AOP代理可以是基于JDK动态代理,也可以是基于CGLIB代理。Spring默认使用的是基于Java Dynamic P

11、roxy模式实现,这样任何的接口都能被代理。基于Spring框架的应用程序开发,程序员会有一种自然的倾向性来实现面向接口编程而不是类,业务对象通常也是实现一个或者多个接口,这也是一种良好的编程习惯。Spring也可以基于CGLIB实现AOP代理,这样所代理的是类而不是接口。如果一个业务对象没有实现某一个接口,那么CGLIB将被使用。2.3 Spring AOP动态代理解析2.3.1 动态代理简单实现(1) 编写要代理的接口(2) 把目标对象去实现接口(3) 开发相应的通知(前置通知,后置通知,环绕通知,异常通知),写出代码(4) 在spring容器文件配置 配置通知类 配置目的对象 配置代理对

12、象(三个内容 接口, 通知织入, 代理哪些对象)(5) 测试2.4 spring的AOP机制实现类代理的方式2.4.1 概述一种是单个代理,一种是自动代理。 单个代理通过ProxyFactoryBean来实现,自动代理通过BeanNameAutoProxyCreator或者 DefaultAdvisorAutoProxyCreator实现。 为了给程序加入日志功能,我们采用aop的方式。编写一个日志通知类 :com.zz.service.server.LogService 配置文件中添加以下代码: .*insertNadCustomerRealFinance.*2.4.2 单个代理(这种方式费时费力,项目中需要多出加入通知的话,不会采用此方式)需要在Spring配置文件中添加: !-!-!-!-!-logAdvisor-!-!-!-!-!-!- - 项目中其他通过注入方式设置FinanceInFacade属性的bean,不能直接注入FinanceInFacade的bean id.而要注入代理的bean id,此例中就是log。 2.4.3 自动代理增加此行,容器会自动根据通知要匹配的切入点,为包含切入点的类创建代理动态。2.5 Spring AOP解析 2.5.1 创建通知

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号