spring 的 aop :基于annotation 的“零配置”方式

上传人:第*** 文档编号:32697481 上传时间:2018-02-12 格式:DOCX 页数:12 大小:32.82KB
返回 下载 相关 举报
spring 的 aop :基于annotation 的“零配置”方式_第1页
第1页 / 共12页
spring 的 aop :基于annotation 的“零配置”方式_第2页
第2页 / 共12页
spring 的 aop :基于annotation 的“零配置”方式_第3页
第3页 / 共12页
spring 的 aop :基于annotation 的“零配置”方式_第4页
第4页 / 共12页
spring 的 aop :基于annotation 的“零配置”方式_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《spring 的 aop :基于annotation 的“零配置”方式》由会员分享,可在线阅读,更多相关《spring 的 aop :基于annotation 的“零配置”方式(12页珍藏版)》请在金锄头文库上搜索。

1、【学习】Spring 的 AOP :基于 Annotation 的“零配置”方式AOP(Aspect Orient Programming ) , 面向切面编程 。 1、AOP 的基本概念:AOP 框架并不与特定的代码耦合,AOP 框架能处理程序执行中特定的切入点(Pointcut),而不与具体某个类耦合。AOP 框架具有如下特征:1、各步骤之间的良好隔离性。2、源代码无关性。AOP 的专业术语:1、Aspect(切面) : 应用运行过程中的关注点,关注点可以横切多个对象,被称为横切关注点。2、pointcut (切入点):可插入增强处理的连接点。3、joinpoint(连接点):程序执行过程

2、中明确的点,如方法的调用,或者异常的抛出。4、advice(增强处理):AOP 框架特定的切入点执行的增强处理如何使用表达式来定义切入点:1、引入:将方法或字段添加到被处理的类中。2、目标对象:被 AOP 框架进行增强处理的对象,也被称为被增强的对象。如果 AOP 框架是通过运行时代理来实现的,那么这个对象是一个被代理的对象。3、AOP 代理:AOP 框架创建的对象,简单的说,代理就是对目标对象的增强。4、织入(Weaving ):将增强处理添加到目标对象中,并创建一个被增强的处理的过程就是织入。2、Spring 的 AOP 支持在 AOP 编程,我们需要做如下三部分:1、定义普通组件。2、定

3、义切入点、一个切入点可能横切多个业务组件。3、定义增强处理,增强处理就是在 AOP 框架为普通业务组件织入的处理动作。AOP 编成的关键是 定义切入点 和 定义增强处理,Spring 依然有如下两个方法来实现:1、基于 Annotation 的“零配置”方式。2、使用 XML 配置文件的管理方式。3、基于 Annotation 的“零配置”方式为了启动 Spring 对AspectJ 切面配置的支持,并保证 Spring 容器中的目标 Bean 被一个或多个切面自动增强,必须在 Spring 配置文件下配置如下代码:但是希望完全启动 Spring 的“零配置”功能,则配置代码中还需添加:这里给

4、出下面 增强处理的目标类:package org.service.imp;import org.service.Person;import org.springframework.stereotype.*;Componentpublic class Chinese implements Person public String sayHello(String name) / TODO Auto-generated method stubreturn name + 你好 , Spring Aop;public void eat(String food) / TODO Auto-generated

5、 method stubSystem.out.println(我正在吃: + food) ;3.1 定义切面 Bean在启动AspectJ 支持以后,只要在 Sping 容器中配置一个带Aspect 注释的 Bean ,Spring 将会自动识别该 Bean,并将该 Bean 作为切面处理。使用Aspect 标注一个 Java 类,该 Java 类将会作为切面 Bean Aspectpublic class AspectTest/定义类的其他类容.3.2 定义 Before 增强处理使用Before 来标注一个方法,使该方法作为一个 Before 增强处理。使用Before 标注时,通常需要指

6、定一个 value 值,改值指定一个切入表达式,用于指定该增强处理将被织入哪些切入点。如:Before(execution(* blogs.jbelial.*.*(.) 在被它标注的方法将匹配 blogs.jbelial 包下的所有类的、所有方法的执行作为切入点。如: package org.advice.Before;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;/定义一个切面Aspectpublic class BeforeAdviceTest /匹配该包下的所有类Be

7、fore( execution(* org.service.imp.*.*(.)public void authority()System.out.println(模拟执行权限检查) ;注:在定义增强处理时的 Spring 配置文件如何配置,可以参考 Spring 的“零配置”支持“ 的学习。3.3 定义 AfterReturning 增强处理类似于使用Before ,使用AfterReturning 来标注一个增强处理,该增强处理将会在目标方法正常完成后被织入。在使用AfterReturning Annotation 时可以指定如下两个常量属性。1、pointcut/value : 用于指定

8、切入点对于的表达式。2、returning :制定一个返回值形参名,增强处理定义的方法可以通过该形参名来访问目标方法的返回值。如:AfterReturning(returning =rvt , pointcut = execution(* blogs.jbelial.*.*(.) ; 指定一个 returning 属性,该属性值为 rvt , 表示 允许在 增强处理方法中使用名为 rvt 的形参,该形参代表目标方法的返回值。AfterReturning Annotation 的 returning 属性所制定的的形参名必须对应于增强处理中的一个形参名。当目标方法执行返回后,返回值作为相应的参数

9、值传入增强处理的方法。如下:package org.advice.AfterReturning;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;Aspectpublic class AfterReturningAdivceTest AfterReturning( returning = rvt ,pointcut = execution(* org.service.imp.*.*(.)public void log(Object rvt)System.out.

10、println(获取目标方法返回值:+rvt) ; System.out.println(模拟记录日志功能.) ; 3.4 定义 AfterThrowing 增强处理:AfterThrowing 增强处理主要用于处理程序中未处理的异常。AfterThrowing Annotation 两个常用的属性: pointcut/value : 如上。 throwing : 指定一个返回参数名,增强处理定义的方法可通过该形参名来访问目标方法中所抛出的异常对象。如:AfterThrowing(throwing = ex ,pointcut = execution(* blogs.jbelial.*.*(.

11、)3.5 After 增强处理:After 与 AfterReturning 的区别:After : 增强处理不管目标方法如何结束,他都会被织入。因此,After 增强处理必须准备处理正常返回和异常返回两种情况,这种增强处理通常用于释放资源。AfterReturning : 增强处理只有在目标方法成功完成才会被织入。如下: package org.advice.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.After;Aspectpublic class AfterAdvic

12、eTest After (execution(* org.service.imp.*.*(.)public void release()System.out.println(模拟方法结束后的释放资源.); 3.6 Around 增强处理 :Around 增强处理既可以在执行目标方法之前织入增强处理,可以在执行目标方法之后织入增强动作。同时,Around 增强处理甚至可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标方法的执行。 Around 增强处理可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值。当定义一个 Around 增强处理方法时,该方法的第一个形参必须是

13、ProceedingJoinPoint 类型,调用 ProceedingJoinPoint 的 proceed() 方法才会执行目标方法。如下: package org.advice.Around;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;Aspectpublic class AroundAdviceTest Around ( execution(* org.service.imp.*.*(.)public void processText(ProceedingJoinPoi

14、nt PJ) throws ThrowableSystem.out.println(执行目标方法之前,模拟开始事务。);PJ.proceed() ; System.out.println(执行目标方法之后,模拟结束事务。);3.7 访问目标方法的参数:访问目标方法的做法是定义增强处理时将第一个参数定义为 JoinPoint 类型,当该增强处理方法被调用时,该 JoinPoint 参数就代表了织入增强处理的连接点。该 JoinPoint 里包含了如下常用的方法: Object getArgs() : 返回执行目标方法时的参数。 Signature getSignature() : 返回被增强的方

15、法的相关信息。 Object getTarget() : 返回被织入增强处理的目标对象。 Object getThis() : 返回 AOP 框架为目标的相关信息。注意:ProceedingJoinPoint 该类是 JoinPoint 的子类。3.8 定义切入点:为一个切入表达式起一个名称,从而允许在多个增强处理中重用该名称。Spring AOP 只支持以 Spring Bean 的方法执行组 作为连接点,所以可以把切入点看错所有能和切入表达式匹配的 Bean 方法。切入点定义包含两个部分: 一个切入点表达式。 一个包含名字和任意参数的方法签名。如下: package org.advice.AfterReturning;import org.aspectj.lang.annotation.*;Aspectpublic class adviceExpression Pointcut(execution(* org.service.imp.*.*(.)public void test() 注意:上面代码中的 test 方法的返回值必须是 void , 且当用 private 访问控制符修饰时,则仅能在切面类中使用该切入点。package org.advice.AfterReturning;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 职业教育

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