Spring AOP深度学习

为了更好地应用AOP技术,技术专家们成立了AOP联盟来探讨AOP标准化。对应于现有的AOP实现方案,AOP联盟对它们进行了一定程度的抽象,从而定义出AOP体系结构(如下图所示)。结合这个体系结构去了解AOP技术,有助于理解AOP概念。 输入图片说明

AOP联盟定义的AOP体系结构把与AOP相关的概念大致分为由高到低从使用到实现的三个层次。从上往下,最高层是语言和开发环境,在这个环境中可以看到几个重要的概念:

  • **基础(Base)**可视为待增强对象或者说目标对象;
  • **切面(Aspect)**通常包含对于基础的增强应用;
  • **配置(Configuration)**可以看成是一种编织,通过在AOP体系中提供这个配置环境,可以把基础和切面结合起来,从而完成切面对目标对象的编织实现。

在Spring AOP实现中,使用Java语言来实现增强对象与切面增强应用,并为这两者的结合提供了配置环境。对于编织配置,毫无疑问,可以使用Spring IoC容器来完成;对于POJO对象的配置,本来就是Spring核心IOC容器的强项。因此,对于使用Spring的AOP开发而言,使用POJO就能完成AOP任务。

专业术语

切面(Aspect)

aspectpointcutadvice组成,它既包括了横切逻辑的定义,也包括了连接点的定义。Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的**连接点(join point)**中。

AOP的工作重心在于如何将**增强(advice)织入目标对象的连接点(Join point)**上,这里包含两个工作:

  1. 如何通过poincut和advice定位到特定的joinpoint上
  2. 如何在advice中编写切面代码

增强(advice)

定义:advice,由aspect添加到特定的Join point(符合pointcut规则的join point)的一段代码。 许多AOP框架,包括Spring AOP,会将advice模拟为一个拦截器(interceptor),并且在join point上维护多个advice,进行层层拦截。例如http鉴权的实现,我们可以为每个使用RequestMapping注解的方法织入advice,当http请求到来时,首先进入到advice代码中,advice中我们可以分析http请求是否有相应的权限,如果有,则执行Controller,如果没有,抛出异常。这里的advice就扮演着鉴权拦截器的角色。

连接点(join point)

定义

a point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution.

程序运行中的一些时间点,例如一个方法的执行,或者是一个异常的处理。 在Spring AOP中,join point总是方法的执行点,即只有方法连接点。

切点(point cut)

定义:匹配Join point 的谓词。 advice是和特定的point cut关联的,并且在point cut相匹配的Join point中执行。

在Spring中,所有的方法都可以认为是Join point,但是我们并不希望在所有的方法上都添加advice,而point cut的作用就是提供一组规则(使用aspect pointcut expression language描述的)来匹配Join point,给满足规则的Joinpoint添加advice。

关于joinpoint(连接点)和pointcut(切点)的 区别

在Spring AOP中,所有的方法执行都是join point,而point cut是一个描述信息,它修饰的是join point,通过point cut,我们就可以确定哪些join point可以 被织入advice,因此join point 和point cut本质上就是两个不同纬度上的东西。

advice,是在join point上执行的,而point cut是规定了哪些join point可以执行哪些advice

目标对象(target)

定义:织入advice的目标对象。目标对象也被称为advised object。 因为Spring AOP使用运行时代理的方式来实现aspect,因此adviced object总是一个代理对象(proxied object)。注意,adviced object指的不是原来的类,而是织入advice后产生的代理类。

AOP proxy

一个类被AOP织入advice,就会产生一个结果类,它是融合了原类和增强逻辑的代理类。 在Spring AOP中,一个AOP代理是一个JDK动态代理对象或CGLIB代理对象。

织入(weaving)

将aspect和其他对象连接起来,并创建adviced object的过程。

根据不同的实现技术,AOP织入有三种方式:

  • 编译器织入,这要求有特殊的Java编译器
  • 类装载期织入,这需要有特殊的类加载器
  • 动态代理织入,在运行期为目标类添加增强(Advice)生成子类的方式。 Spring采用动态代理织入方式,而Aspect采用编译器织入类装载期织入方式。

Advice类型

  • before advice,在join point前被执行的advice。虽然before advice是在join point前被执行,但是它并不能阻止join point的执行,除非发生了异常(即我们在before advice代码中,不能人为地决定是否继续执行join point中的代码)
  • after return advice,在一个join point正常返回后执行的advice
  • after throwing advice,当一个join point抛出异常后执行的advice
  • after (final) advice,无论一个join point是正常退出还是发生异常,都会被执行的advice
  • around advice,在join point前和join point退出后都执行的advice,这个是最常用的advice

关于 AOP proxy

Spring AOP默认使用标准的JDK动态代理(dynamic proxy)技术实现AOP代理,通过它,我们可以任意的接口实现代理。如果需要为一个类实现代理,那么可以使用CGLIB代理。当一个业务逻辑对象没有实现接口时,那么Spring AOP就默认使用CGLIB来作为AOP代理了。即如果我们需要为一个方法织入advice,但是这个方法不是一个接口所提供的方法,则此时Spring AOP会使用CGLIB来实现动态代理。鉴于此,Spring AOP建议基于接口编程,对接口进行AOP而不是类。

彻底理解aspect,join point,point cut,advice

在Spring AOP中,join point指代的是所有方法的执行点,而point cut是一个描述信息,它修饰的是join point,通过point cut,我们就可以确定哪些join point可以被织入Advice。

  • join point,是所有可可能被织入advice的候选点,在Spring AOP中,则可以认为所有方法执行点都是join point。
  • point cut,Spring AOP中所有的方法(join point)都可以织入advice,但是我们并不希望在所有方法上都织入advice,而point cut的作用就是提供一组规则来匹配join point,给满足规则的joinpoint添加advice。
  • advice,是一个动作,即一段java代码,这段java代码是作用于point cut所限定的那些join point上的。
  • aspect,是point cut和advice的组合。
  • advisor,用来定义只有一个通知和一个切入点的切面,要实现自定义的Advice,必须实现MethodInterceptor接口

或者从语法的角度来做一个不严谨的类比: joinpoint可以认为是一个宾语,而point cut则可以类比为修饰join point的定语,那么整个aspect可以描述为满足pointcut规则的joinpoint会被添加相应的advice操作。

转载于:https://my.oschina.net/u/1251536/blog/1590000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值