版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SpringAOP概述动态代理基于代理类的AOP实现基于XML的声明式AspectJ基于注解的声明式AspectJ第8章
SpringAOP2024/1/29学习目标/Target2了解AOP的概念和作用
理解AOP术语
熟悉Spring中两种动态代理方式的区别
掌握基于代理类的AOP实现掌握基于XML的声明式AspectJ和
基于注解的声明式AspectJ章节概述/Summary3Spring的AOP模块是Spring框架体系中十分重要的内容,该模块一般适用于具有横切逻辑的场景,如访问控制、事务管理和性能监控等,本章将对SpringAOP的相关知识进行详细讲解。目录/CONTENTSSpringAOP概述基于XML的声明式AspectJ基于代理类的AOP实现动态代理4基于注解的声明式AspectJ14325SpringAOP概述01第8章SpringAOP什么是AOP?SpringAOP简介6
AOP的全称是Aspect-OrientedProgramming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。在传统的业务处理代码中,通常都会进行事务处理、日志记录等操作。虽然使用OOP可以通过组合或者继承的方式来达到代码的重用,但如果要实现某个功能(如日志记录),同样的代码仍然会分散到各个方法中。这样,如果想要关闭某个功能,或者对其进行修改,就必须要修改所有的相关方法。这不但增加了开发人员的工作量,而且提高了代码的出错率。为了解决这一问题,AOP思想随之产生。AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。这种采用横向抽取机制的方式,采用传统的OOP思想显然是无法办到的,因为OOP只能实现父子关系的纵向的重用。虽然AOP是一种新的编程思想,但却不是OOP的替代品,它只是OOP的延伸和补充。SpringAOP简介7未使用AOP的面向切面编程案例
例如,订单系统中有添加订单信息、更新订单信息和删除订单信息3个方法,这3个方法中都包含事务管理业务代码,订单系统的逻辑如图所示。Spring
AOP概述8SpringAOP简介9
AOP的使用,使开发人员在编写业务逻辑时可以专心于核心业务,而不用过多的关注于其他业务逻辑的实现,这不但提高了开发效率,而且增强了代码的可维护性。类与切面的关系AOP面向切面编程的优势
由订单系统可知,添加订单信息、修改订单信息、删除订单信息的方法体中都包含事务管理的业务逻辑,这就带来了一定数量的重复代码并使程序的维护成本增加。基于AOP的面向切面编程,可以为此类问题提供解决方案,AOP可以将事务管理的业务逻辑从这三个方法体中抽取到一个可重用的模块,进而降低横向业务逻辑之间的耦合,减少重复代码。AOP的使用,使开发人员在编写业务逻辑时可以专心于核心业务,而不用过多地关注其他业务逻辑的实现,不但提高了开发效率,又增强了代码的可维护性。Spring
AOP概述10AOP术语11Aspect:封装的用于横向插入系统功能(如事务、日志等)的类Joinpoint:在程序执行过程中的某个阶段点Pointcut:切面与程序流程的交叉点,即那些需要处理的连接点Advice(通知/增强处理):AOP框架在特定的切入点执行的增强处理,即在定义好的切入点处所要执行的程序代码。可以将其理解为切面类中的方法。TargetObject(目标对象):指所有被通知的对象,也被称为被增强对象。如果AOP框架采用的是动态的AOP实现,那么该对象就是一个被代理对象。Proxy(代理):将通知应用到目标对象之后,被动态创建的对象。Weaving(织入):将切面代码插入到目标对象上,从而生成代理对象的过程。AOP术语
AOP并不是一个新的概念,AOP中涉及很多术语,如切面、连接点、切入点、通知/增强处理、目标对象、织入、代理和引介等,下面针对AOP的常用术语进行简单介绍。
Spring
AOP术语切面(Aspect)切面是指关注点形成的类(关注点是指类中重复的代码),通常是指封装的、用于横向插入系统的功能类(如事务管理、日志记录等)。在实际开发中,该类被Spring容器识别为切面,需要在配置文件中通过<bean>元素指定。连接点(Joinpoint)连接点是程序执行过程中某个特定的节点,例如,某方法调用时或处理异常时。在SpringAOP中,一个连接点通常是一个方法的执行。
切入点(Pointcut)当某个连接点满足预先指定的条件时,AOP就能够定位到这个连接点,在连接点处插入切面,该连接点也就变成了切入点。通知/增强处理(Advice)通知/增强处理就是插入的切面程序代码。可以将通知/增强处理理解为切面中的方法,它是切面的具体实现。12AOP术语
AOP并不是一个新的概念,AOP中涉及很多术语,如切面、连接点、切入点、通知/增强处理、目标对象、织入、代理和引介等,下面针对AOP的常用术语进行简单介绍。
Spring
AOP术语目标对象(Target)目标对象是指被插入切面的方法,即包含主业务逻辑的类对象。或者说是被一个或者多个切面所通知的对象。织入(Weaving)将切面代码插入到目标对象上,从而生成代理对象的过程。织入可以在编译时,类加载时和运行时完成。在编译时进行织入就是静态代理,而在运行时进行织入则是动态代理。代理(Proxy)将通知应用到目标对象之后,程序动态创建的通知对象,就称为代理。代理类既可能是和原类具有相同接口的类,也可能就是原类的子类,可以采用调用原类相同的方式调用代理类。引介(Introduction)引介是一种特殊的通知,它为目标对象添加一些属性和方法。这样,即使一个业务类原本没有实现某一个接口,通过AOP的引介功能,也可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。13动态代理02第8章SpringAOPJDK动态代理15
JDK动态代理是通过java.lang.reflect.Proxy
类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现AOP。CGLIB代理16
通过前面的学习可知,JDK的动态代理用起来非常简单,但它是有局限性的,使用动态代理的对象必须实现一个或多个接口。
那么,如何代理没有实现接口的类?CGLIB代理17
CGLIB(CodeGenerationLibrary)是一个高性能开源的代码生成包,它采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。
如果想代理没有实现接口的类,那么可以使用CGLIB代理。
JDK动态代理存在缺陷,它只能为接口创建代理对象,当需要为类创建代理对象时,就需要使用CGLib(CodeGenerationLibrary)动态代理,CGLib动态代理不要求目标类实现接口,它采用底层的字节码技术,通过继承的方式动态创建代理对象。Spring的核心包已经集成了CGLib所需要的包,所以开发中不需要另外导入JAR包。JDK与CGLib动态代理的比较18实现JDK动态代理与CGLIB动态代理的使用19需求说明使用JDK动态代理与CGLIB动态代理,对业务方法的执行过程进行模拟权限检查、日志记录。共性问题集中讲解20常见问题及解决办法代码规范问题调试技巧共性问题集中讲解基于代理类的AOP实现03第8章SpringAOPSpring的通知/增强类型22org.springframework.aop.MethodBeforeAdvice(前置通知/增强)
在目标方法执行前实施增强,可以应用于权限管理等功能。org.springframework.aop.AfterReturningAdvice(后置通知/增强)
在目标方法执行后实施增强,可以应用于关闭流、上传文件、删除
临时文件等功能。ercept.MethodInterceptor(环绕通知/增强)
在目标方法执行前后实施增强,可以应用于日志、事务管理等功能。org.springframework.aop.ThrowsAdvice(异常抛出通知/增强)
在方法抛出异常后实施增强,可以应用于处理异常记录日志等功能。org.springframework.aop.IntroductionInterceptor(引介通知/增强)
在目标类中添加一些新的方法和属性,可以应用于修改老版本程序。
Spring按照通知在目标类方法的连接点位置,可以分为5种类型,具体如下:ProxyFactoryBean23
ProxyFactoryBean是FactoryBean接口的实现类,FactoryBean负责实例化一个Bean,而ProxyFactoryBean负责为其他Bean创建代理实例。在Spring中,使用ProxyFactoryBean是创建AOP代理的基本方式。ProxyFactoryBean类中的常用可配置属性如下:使用基于代理类的AOP实现模拟权限检查、
日志记录功能24需求说明使用基于代理类的AOP对业务方法的执行过程进行模拟权限检查、日志记录。共性问题集中讲解25常见问题及解决办法代码规范问题调试技巧共性问题集中讲解基于XML的
声明式AspectJ04第8章SpringAOPAspectJ开发27
AspectJ是一个基于Java语言的AOP框架,它提供了强大的AOP功能。Spring2.0以后,SpringAOP引入了对AspectJ的支持,并允许直接使用AspectJ进行编程,而Spring自身的AOPAPI也尽量与AspectJ保持一致。新版本的Spring框架,也建议使用AspectJ来开发AOP。使用AspectJ实现AOP有两种方式:一种是基于XML的声明式AspectJ,另一种是基于注解的声明式AspectJ。概述使用AOP代理对象的好处
因为SpringAOP中的代理对象由IoC容器自动生成,所以开发者无须过多关注代理对象生成的过程,只需选择连接点、创建切面、定义切点并在XML文件中添加配置信息即可。Spring提供了一系列配置SpringAOP的XML元素。
基于XMl的AOP实现28配置SpringAOP的XML元素29元素描述<aop:config>SpringAOP配置的根元素<aop:aspect>配置切面<aop:advisor>配置通知器<aop:pointcut>配置切点<aop:before>配置前置通知,在目标方法执行前实施增强,可以应用于权限管理等功能<aop:after>配置后置通知,在目标方法执行后实施增强,可以应用于关闭流、上传文件、删除临时文件等功能<aop:around>配置环绕方式,在目标方法执行前后实施增强,可以应用于日志、事务管理等功能<aop:after-returning>配置返回通知,在目标方法成功执行之后调用通知<aop:after-throwing>配置异常通知,在方法抛出异常后实施增强,可以应用于处理异常记录日志等功能基于XML的声明式AspectJ是指通过XML文件来定义切面、切入点及通知,所有的切面、切入点和通知都必须定义在<aop:config>元素内。基于XML的声明式AspectJ30<aop:config>元素及其子元素如下:小提示:图中灰色部分标注的元素即为常用的配置元素
XML文件中常用元素的配置方式如下:基于XML的声明式AspectJ31<beanid="myAspect"class="com.test.aspectj.xml.MyAspect"/><aop:config><aop:aspectid="aspect"ref="myAspect"><aop:pointcutexpression="execution(*com.test.jdk.*.*(..))“id="myPointCut"/><aop:beforemethod="myBefore"pointcut-ref="myPointCut"/><aop:after-returningmethod="myAfterReturning“pointcut-ref="myPointCut" returning="returnVal"/><aop:aroundmethod="myAround"pointcut-ref="myPointCut"/><aop:after-throwingmethod="myAfterThrowing“pointcut-ref="myPointCut" throwing="e"/><aop:aftermethod="myAfter"pointcut-ref="myPointCut"/></aop:aspect></aop:config>定义切面Bean配置切面配置切入点配置通知配置切面
在Spring的配置文件中,配置切面使用的是<aop:aspect>元素,该元素会将一个已定义好的SpringBean转换成切面Bean,因此,在使用<aop:aspect>元素之前,要在配置文件中先定义一个普通的SpringBean。SpringBean定义完成后,通过<aop:aspect>元素的ref属性即可引用该Bean。配置<aop:aspect>元素时,通常会指定id和ref两个属性。
基于XML的声明式AspectJ32<aop:aspect>元素的id属性和ref属性的描述基于XML的声明式AspectJ33属性名称描述id用于定义该切面的唯一标识ref用于引用普通的SpringBean配置切入点
在Spring的配置文件中,切入点是通过<aop:pointcut>元素来定义的。当<aop:pointcut>元素作为<aop:config>元素的子元素定义时,表示该切入点是全局的,它可被多个切面共享;当<aop:pointcut>元素作为<aop:aspect>元素的子元素时,表示该切入点只对当前切面有效。定义<aop:pointcut>元素时,通常会指定id、expression属性。
基于XML的声明式AspectJ34<aop:pointcut>元素的id属性和expression属性描述基于XML的声明式AspectJ35属性名称描述id用于指定切入点的唯一标识expression用于指定切入点关联的切入点表达式基于XML的声明式AspectJ36切入点表达式
execution(*com.test.jdk.*.*(..))是定义的切入点表达式,该切入点表达式的意思是匹配com.test.jdk包中任意类的任意方法的执行。execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-pattern(param-pattern)throws-pattern?)表达式的主体返回类型,使用*代表所有类型需要拦截的包名类名,使用*代表所有类方法名,使用*代表所有方法方法的参数,其中的“..”表示任意参数注意:这里有一个空格切入点表达式的基本格式:定义的目标方法的访问修饰符,如public、private等定义的目标方法的返回值类型,如void、String等定义的目标方法的类路径,如com.test.jdk.UserDaoImpl具体需要被代理的目标方法,如add()方法需要被代理的目标方法包含的参数需要被代理的目标方法抛出的异常类型小提示:带有问号(?)的部分表示可配置项,而其他部分属于必须配置项。execution表达式各部分参数说明modifiers-pattern:表示定义的目标方法的访问修饰符,如public、private等。ret-type-pattern:表示定义的目标方法的返回值类型,如void、String等。declaring-type-pattern:表示定义的目标方法的类路径,如com.test.jdk.UserDaoImpl。name-pattern:表示具体需要被代理的目标方法,如add()方法。param-pattern:表示需要被代理的目标方法包含的参数,本章示例中目标方法参数都为空。throws-pattern:表示需要被代理的目标方法抛出的异常类型。
基于XML的声明式AspectJ37execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-pattern(param-pattern)throws-pattern?)配置通知
在Spring的配置文件中,使用<aop:aspect>元素配置了5种常用通知,分别为前置通知、后置通知、环绕通知、返回通知和异常通知。
基于XML的声明式AspectJ38<aop:aspect>元素的常用属性基于XML的声明式AspectJ39属性描述pointcut该属性用于指定一个切入点表达式,Spring将在匹配该表达式的连接点时织入该通知。pointcut-ref该属性指定一个已经存在的切入点名称,如配置代码中的myPointCut。通常pointcut和pointcut-ref两个属性只需要使用其中一个即可。method该属性指定一个方法名,指定将切面Bean中的该方法转换为增强处理。throwing该属性只对<after-throwing>元素有效,它用于指定一个形参名,异常通知方法可以通过该形参访问目标方法所抛出的异常。returning该属性只对<after-returning>元素有效,它用于指定一个形参名,后置通知方法可以通过该形参访问目标方法的返回值。使用SpringAOP实现日志记录功能40需求说明使用前置增强处理和后置增强处理对业务方法的执行过程进行日志记录。提示(1)在项目中添加与Spring
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水产公司合同范例封面
- 国际会展中心房产交易合同范本
- 新家电销售合同范例
- 水库厂房施工合同范例
- 园林绿化合同案例
- 建筑加固增补合同
- 2024年昆明客运驾驶员考试题库答案
- 公司店铺租赁合同模板
- 公房购房合同范例
- 旗杆采购合同范例
- 物业保洁员培训教程
- 山西省太原市2024-2025学年高三上学期期中物理试卷(含答案)
- 酒店岗位招聘面试题与参考回答2025年
- 公安接处警培训
- JGJ18-2012钢筋焊接及验收规程
- 胸部术后护理科普
- 新人教版高中地理必修一第四章第一节-常见的地貌类型
- 2020 ACLS-PC-SA课前自我测试试题及答案
- 炫彩招聘海报模板
- 8健康上网(五年级安全教育)讲课教案
- TGNET培训讲义
评论
0/150
提交评论