配色: 字号:
第4章 Spring AOP(面向方面编程)
2022-09-26 | 阅:  转:  |  分享 
  
第4章SpringAOP(面向方面编程)4.1AOP概述4.2基于XML配置文件的AOP实现4.3基于@AspectJ注解
的AOP实现4.1AOP概述AOP是AspectOrientedProgramming的简称,即面向方面编程,它是一种编程
范式,一般适用于具有横切逻辑的场合,如访问控制、事务管理、性能监测等,旨在通过允许横切关注点的分离,提高模块化。AOP提供方面来将
跨越对象关注点模块化。目前有许多AOP框架,其中最流行的两个框架为SpringAOP和AspectJ。4.1.14.1.24.1
.1认识AOP面向方面编程(AOP)也称为面向切面编程,是软件编程思想发展到一定阶段的产物,虽然是一种新的编程思想,但却不是面
向对象编程(ObjectOrientedProgramming,OOP)的替代品,它只是OOP的有益补充和延伸。面向对象程序
设计中将程序分解为不同层次的对象,通过封装、继承、多态等特性将对象组织成一个整体来完成功能,但是在一定场合,面向对象编程也暴露出一
些问题。在传统的业务处理代码中,通常会进行日志记录、参数合法性验证、异常处理、事务控制等操作。虽然使用OOP可以通过组合或者继承的
方式来达到代码的重用,但要实现某些功能(如日志记录),同样的代码仍然会分散到各个方法中。这样,如果要关闭某个功能,或者对其进行修改
,就必须要修改所有的相关方法。这不仅增加开发者的工作量,相应的代码出错率也会提高。4.1.1认识AOP在业务系统中,总有一些散
落、渗透到系统各处且不得不处理的事情,这些穿插在既定业务中的操作就是所谓的“横切逻辑”,也称为切面。将重复性的代码抽取出来,放在专
门的类和方法中的处理,这样就便于管理和维护了。即便如此,依然无法实现既定业务和横切逻辑的彻底解耦,因为业务方法中还要保留这些方法的
调用代码,当需要增加或者减少横切逻辑的时候,还是要修改业务方法中的调用代码才能实现。我们所希望的是无需编写显式的调用,在需要的时候
能够“自动”调用所需的功能,这正是AOP所要解决的问题。AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序
编译或运行时,再将这些提取出来的代码应用到需要执行的地方。这种采用横向抽取机制的方式,采用传统的OOP思想是无法办到的,因为OOP
只能实现纵向的重用。4.1.1认识AOP面向方面编程,其设计思想来源于代理设计模式,通常情况下调用对象的方法如下所示。在代
理模式中,可为对象设置一个代理对象,代理对象为func()提供一个代理方法。在此模式下,就可在原有代码乃至原业务流程都不变的情况
下,直接在业务流程汇总切入新代码,增加新功能,这就是所谓的面向切面编程。AOP的使用,使开发人员在编写业务逻辑时可以专心于核心业务
,而不用过多地关注于其他业务的实现,这不但提高了开发效率,而且增强了代码的可维护性。4.1.2AOP术语AOP中涉及到切面、通
知、切入点、目标对象、代理对象、织入等很多术语,常用的术语简单介绍如下:切面(Aspect)连接点(JoinPoint)切入点(P
ointcut)通知/增强处理(Advice)目标对象(TargetObject)代理对象(ProxyObject)织入(W
eaving)AOP的概念比较生涩难懂,切面可以理解为由增强处理和切入点组成,即包含了横切逻辑的定义,也包含了连接点的定义。4.
2基于XML配置文件的AOP实现SpringAOP通知包括前置通知、返回通知、异常通知和环绕通知。使用AOP框架时,开发者需
要做的主要工作是定义切入点和通知,通常采用XML配置文件或注解的方式,配置好切入点和增强处理的信息后,AOP框架会自动生成AOP代
理。本小节将基于XML配置文件的方式实现如下通知。4.2.14.2.24.2.34.2.44.2.1前置通知前置通知在连接点(
所织入的业务方法)前面执行,不会影响连接点的执行,除非此处抛出异常。下面通过示例演示如何实现前置通知,其过程如下所示:(1)
将spring-1项目复制并重命名为“spring-5“。(2)在前面核心包的基础上,向项目中导入所需的jar包:sprin
g-aop-5.0.4.RELEASE.jar、spring-aspects-5.0.4.RELEASE.jar、aopallia
nce-1.0.jar和aspectjweaver-1.9.1.jar,添加到构建路径中。(3)创建包com.ssm.serv
ice,在包中创建接口ProductService。(4)创建包com.ssm.service.impl,创建ProductS
ervice接口的实现类ProductServiceImpl。(5)创建包com.ssm.aop,创建日志通知类AllLogA
dvice。(6)编辑Spring配置文件applicationContext.xml。(7)在com.ssm包中创建测试
类TestAOP.java4.2.2返回通知返回通知是指在连接点正常执行后实施增强,不管是正常执行完成,还是抛出异常,都会执行
返回通知中的内容。下面通过示例演示如何实现返回通知,其过程如下所示:(1)在日志通知类AllLogAdvice中添加方
法myAfterReturnAdvice。(2)在Spring配置文件applicationContext.xml中的:aspect>元素内添加元素,将AllLogAdvice日志通知类中的myAfter
ReturnAdvice方法指定为返回通知。将applicationContext.xml中前置通知的
置加以注释,再执行测试类TestAOP,控制台输出如下所示:4.2.3异常通知异常通知在连接点抛出异常后执行,下面通过示例演示
如何实现异常通知,其过程如下所示:(1)修改ProductServiceImpl类中browse方法,人为抛出一个异常。(2
)在日志通知类AllLogAdvice中添加方法myThrowingAdvice。(3)在Spring配置文件applicat
ionContext.xml中的元素内添加元素,将AllLogAd
vice日志通知类中的myThrowingAdvice方法指定为异常通知。将applicationContext.xml中前置通
知的和返回通知的配置加以注释,再执行测试类:4.2.4环绕通知
环绕通知围绕在连接点前后,比如一个方法调用的前后,是最强大的通知类型,在方法调用前后自定义操作。环绕通知还需要负责决定是继续处理
joinpoint(调用ProceedingJoinPoint的proceed方法)还是中断执行。下面通过示例演示如何实现环
绕通知,其过程如下所示:(1)修改ProductServiceImpl类中browse方法,通过while循环延长方法的执行时
间。(2)在日志通知类AllLogAdvice中添加方法myAroundAdvice。(3)在Spring配置文件app
licationContext.xml中的元素内添加元素,将AllLogAdvic
e日志通知类中的myAroundAdvice方法指定为环绕通知。将applicationContext.xml中前置通知的p:before>、返回通知的和异常通知的元素配
置加以注释,再执行测试类TestAOP,控制台输出如下。4.3基于@AspectJ注解的AOP实现基于XML配置文件的AOP实
现免不了在Spring配置文件中配置大量的信息,不仅配置麻烦,而且造成配置文件的臃肿。AspectJ框架为AOP的实现提供了一套注
解,用以取代Spring配置文件中为实现AOP功能所配置的臃肿代码。AspectJ是一个面向切面的框架,它扩展了Java语言、定
义了AOP语法,能够在编译期提供代码的织入。@AspectJ是AspectJ5新增的功能,使用JDK5.0注解技术和正规的As
pectJ切点表达式语言描述切面。因此在使用@AspectJ之前,需要保证JDK是5.0或更高版本,否则将无法使用注解技术。Spr
ing通过集成AspectJ实现了以注解的方式定义切面,大大减轻了配置文件的工作量,此外,因为Java的反射机制无法获取方法参数名
,Spring还需要利用轻量级的字节码处理asm(已集成在SpringCore模块中)处理@AspectJ中所描述的方法参数名。
4.3基于@AspectJ注解的AOP实现关于AspectJ注解的说明如下所示:@Aspect:用于定义一个切面。@Point
cut:用于定义一个切入点。@Before:用于定义一个前置通知,相当于BeforeAdvice。@AfterReturning:
用于定义一个后置通知,相当于AfterReturningAdvice。@AfterThrowing:用于定义一个异常通知,相当于T
hrowAdvice。@Around:用于定义一个环绕通知,相当于MethodInterceptor。@After:用于定义最终f
inal通知,不管是否异常,该通知都会执行。4.3基于@AspectJ注解的AOP实现下面使用@AspectJ注解重新实现4.
2小节中AllLogAdvice日志类功能,步骤如下所示:(1)将项目spring-5复制并重命名为“spring-6“。
(2)修改ProductService接口的实现类ProductServiceImpl,在类上添加@Component("pro
ductService")注解。(3)修改日志通知类AllLogAdvice,使用注解定义Bean、切面、切点和四种类型通知
。(4)修改Spring配置文件,配置自动扫描的包,并在配置文件中开启基于@AspectJ切面的注解处理器。在日志通知类AllLogAdvice中,依次启用一个通知方法进行测试,将其它通知方法加以注释,并根据所测试通知类型的需要,修改ProductServiceImpl类中browse方法代码(参考4.2小节),再运行测试类TestAOP,效果与4.2小节相同。4.4小结本章主要介绍了SpringAOP的相关概念,并以日志通知为例先后讲解了基于XML配置文件的AOP实现和基于@AspectJ注解的AOP实现。通过对比分析可知,使用Spring为AOP的实现提供的一组注解,极大地简化了Spring的配置。
献花(0)
+1
(本文系太好学原创)