1 AOP 概念 (Spring 2.0 原文翻译)

开始讲解Spring AOP 之前,让我们先看看AOP中的一些核心概念和术语的定义。
下面这些术语不是Spring 专有的. 让人遗憾的是,AOP 中的技术术语不是特别的直观。
如果Spring 使用 AOP 自己领域中术语的定义的话,那么会让读者变得更加的困惑。

切面(Aspect): 切入到很多类中的一个模块化的关注点, 在Java 应用程序中 事务管理是横切关注点的一个很好例子
在Spring 中Aop的实现可以基于XML的方式进行定义,或者使用基于注解的方式来定义切面.
面向OOP编程中我们把Class 叫做类 ,那么在切面中我们可以把带@Aspect 注解的类叫做切面,
如果你这个类实现的是Controller层的日志记录 那么我们可以更具体的说这个类是一个 Contrller日志切面。

连接点( Join Point) : 程序执行期间的点,比如方法的执行或者异常的处理。在Spring AOP 中连接点表示的是方法的执行
在方法调用前后的点就表示一个被切入的点,切面可以和这个点建立连接那么我们称它为连接点;

通知(Advice) :通知就是一个在连接点执行的动作,这个动作在方法调用的前后被执行所以我们也可以把它理解为拦截器, Spring 有很多不同的通知类型 before ,after ,around 等。很多AOP 框架包括Spring 把通知作为拦截器并且维护着一个环绕连接点的拦截链。

切点(Pointcut): 切点定义通知可以切入到那些连接点中,切点的内容就是通知和连接点的匹配规则,通知和一个或多个切点相关联,通知运行在切点匹配的连接点上。

引入:(introduction) : 为某种类型的类动态的添加额外的方法和字段,Spring 可以让你为被观察的对象引入一个新的接口,
比如使用‘’引入‘’ 让某个bean 实现IsModified 接口,用于简化缓存。

目标对象(target object):被一个或者多个切面观察着的对象称之为目标对象,也可以说是 被观察的对象;
因为Spring AOP 是使用运行时代理来实现的,这个对象是一个被代理的对象。

AOP Proxy :为了实现切面协议由AOP 框架创建的一个代理对象,在Spring 中,AOP 代理的实现通过JDK 动态代理技术,或者CGLIB
来实现。

织入(Weaving) : 把切面和目标对象连接在一起 创建出一个新的对象叫做被观察对象(也就是新的目标对象),这个过程可以在代码编译,加载 ,或者
运行中完成。Spring AOP 像其他纯JAVA AOP 框架一样,在运行时进行织入。

Spring AOP 包含下面的通知类型:

前置通知(Before advice) : 运行在连接点之前的的通知,但没有能力阻止目标对象方法的调用。

后置返回通知(After returning advice): 连接的方法正常执行完成没有发生异常之后执行。(目标方法的调用没有抛出异常)

后置异常通知(After throwing advice): 方法执行期间抛出异常,非正常结束那么会执行这个通知。

后置(最终)通知(After advice):连接点退出(正常或者因为异常返回 但是没有显示的抛出异常)的时候执行。

环绕通知(Around Advice) : 环绕连接点的通知类似于方法的引用,这是最强大的一类通知。
环绕通知可以在方法应用之前或者之后执行用户自定义的行为。它可以选择是否对连接点进行处理,
或者拦截目标方法的执行通过返回自己的返回值或者抛出异常;

环绕通知是最通用的一种通知,因为Spring AOP 像 AspectJ 一样提供了完整的通知类型,
我们建议你尽量选择能合适并能满足你需求通知。比如 你仅仅只是想用方法返回的值更新缓存,那么
你最好选择 后置返回通知(After returning advice) ,虽然环绕通知更功能更强大一点同样也能完成这件事情. 但是这样
子可以简化你的编程模型,同时避免发生不必要的错误 (比如你不需要调用JointPoint 上的proceed 方法)。

在Spring2.0 中 所有的通知参数都是静态的特点类型的对象,所有比起Object arrays 来说使用合适类型(目标方法返回值类型)的通知参数会更好;
连接点(和切入点匹配)的概念是AOP的关键所在,它和老的技术相区分的,
切入点能让通知独立于面向对象的层次而被定位。例如,你可以使用一个环绕通知为一组方法(这些方法在不同对象中)提供事务管理(比如服务层中的所有业务操作)。

关系图
在这里插入图片描述
Aspect 由多个advice 和 pointCut 组成
一个Aspect 有多个advice
一个advice可以有多个pointCut
一个pointCut可以切入多个targetObject 中的多个joinPoint
(这里指的多个是多个方法,其实Spring AOP 只有一种类型的JoinPoint 就是方法执行连接点 ,AspectJ 有很多种 感兴趣的朋友可以自己看)
一个targetObject 有多个 joinPoint

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值