为了更好地应用AOP技术,技术专家们成立了AOP联盟来探讨AOP标准化。对应于现有的AOP实现方案,AOP联盟对它们进行了必定程度的抽象,从而定义出AOP体系结构(以下图所示)。结合这个体系结构去了解AOP技术,有助于理解AOP概念。 java
AOP联盟定义的AOP体系结构把与AOP相关的概念大体分为由高到低 、从使用到实现的三个层次。从上往下,最高层是语言和开发环境,在这个环境中能够看到几个重要的概念:express
在Spring AOP实现中,使用Java语言来实现加强对象与切面加强应用,并为这二者的结合提供了配置环境。对于编织配置,毫无疑问,可使用Spring IoC容器来完成;对于POJO对象的配置,原本就是Spring核心IOC容器的强项。所以,对于使用Spring的AOP开发而言,使用POJO就能完成AOP任务。编程
aspect由pointcut和advice组成,它既包括了横切逻辑的定义,也包括了链接点的定义。Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的**链接点(join point)**中。app
AOP的工做重心在于如何将**加强(advice)织入目标对象的链接点(Join point)**上,这里包含两个工做:框架
定义:advice,由aspect添加到特定的Join point(符合pointcut规则的join point)的一段代码。 许多AOP框架,包括Spring AOP,会将advice模拟为一个拦截器(interceptor),而且在join point上维护多个advice,进行层层拦截。例如http鉴权的实现,咱们能够为每一个使用RequestMapping注解的方法织入advice,当http请求到来时,首先进入到advice代码中,advice中咱们能够分析http请求是否有相应的权限,若是有,则执行Controller,若是没有,抛出异常。这里的advice就扮演着鉴权拦截器的角色。代理
定义:对象
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老是方法的执行点,即只有方法链接点。图片
定义:匹配Join point 的谓词。 advice是和特定的point cut关联的,而且在point cut相匹配的Join point中执行。开发
在Spring中,全部的方法均可以认为是Join point,可是咱们并不但愿在全部的方法上都添加advice,而point cut的做用就是提供一组规则(使用aspect pointcut expression language描述的)来匹配Join point,给知足规则的Joinpoint添加advice。
在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。
定义:织入advice的目标对象。目标对象也被称为advised object。 由于Spring AOP使用运行时代理的方式来实现aspect,所以adviced object老是一个代理对象(proxied object)。注意,adviced object指的不是原来的类,而是织入advice后产生的代理类。
一个类被AOP织入advice,就会产生一个结果类,它是融合了原类和加强逻辑的代理类。 在Spring AOP中,一个AOP代理是一个JDK动态代理对象或CGLIB代理对象。
将aspect和其余对象链接起来,并建立adviced object的过程。
根据不一样的实现技术,AOP织入有三种方式:
Spring AOP默认使用标准的JDK动态代理(dynamic proxy)技术实现AOP代理,经过它,咱们能够任意的接口实现代理。若是须要为一个类实现代理,那么可使用CGLIB代理。当一个业务逻辑对象没有实现接口时,那么Spring AOP就默认使用CGLIB来做为AOP代理了。即若是咱们须要为一个方法织入advice,可是这个方法不是一个接口所提供的方法,则此时Spring AOP会使用CGLIB来实现动态代理。鉴于此,Spring AOP建议基于接口编程,对接口进行AOP而不是类。
在Spring AOP中,join point指代的是全部方法的执行点,而point cut是一个描述信息,它修饰的是join point,经过point cut,咱们就能够肯定哪些join point能够被织入Advice。
或者从语法的角度来作一个不严谨的类比: joinpoint能够认为是一个宾语,而point cut则能够类比为修饰join point的定语,那么整个aspect能够描述为知足pointcut规则的joinpoint会被添加相应的advice操做。