一、链接点(Joinpoint)java
程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。这些代码中的特定点,称为“链接点”。Spring仅支持方法的链接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用先后这些程序执行点织入加强。数据库
二、切点(Pointcut)框架
每一个程序类都拥有多个链接点,如一个拥有两个方法的类,这两个方法都是链接点。但在这为数众多的链接点中,如何定位到某个感兴趣的链接点上呢?AOP经过“切点”定位特定的链接点。经过数据库查询的概念来理解切点和链接点的关系:链接点至关于数据库中的记录,而切点至关于查询条件。一个切点能够匹配多个链接点。性能
Spring中,切点经过Pointcut接口进行描述。代理
三、加强(Advice)对象
加强是织入到目标类链接点上的一段程序代码。加强既包含了用于添加到目标链接点上的一段执行逻辑,又包含了用于定位链接点的方为信息,因此Spring所提供的加强接口都是带方位名的:BeforeAdvice(方法调用前的位置)、AfterReturningAdvice(访问返回后的位置)、ThrowsAdvice等。接口
四、目标对象(Target)get
加强逻辑的织入目标类。编译器
五、织入(Weaving)io
织入是将加强添加到目标类具体链接点上的过程。AOP有三种织入方式:
1)编译期织入,这要求使用特殊的Java编译器;
2)类装载期织入,这要求使用特殊的类装载器;
3)动态代理织入,在运行期为目标类添加加强生成子类的方式。
Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。
六、切面(Aspect)
切面由切点和加强组成,它既包括了横切逻辑的定义,也包括了链接点的定义,Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的链接点中。
AOP的工做重心,主要包括两个:
1)如何经过切点和加强定位到链接点上;
2)如何在加强中编写切面的代码。
七、其余基础知识
Spring AOP使用了两种代理机制:一种是基于JDK的动态代理,另外一种是基于CGLib的动态代理。之因此须要两种代理机制,很大程度上是由于JDK自己只提供接口的代理,而不支持类的代理。
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。
CGLib采用很是底层的字节码技术,能够为一个类建立子类,并在子类中采用方法拦截的技术拦截全部父类方法的调用。
有研究代表,CGLib所建立的动态代理对象的性能比JDK的所建立的代理对象的性能高了很多。但CGLib在建立代理对象时所花费的时间却比JDK动态代理多,因此对于singleton的代理对象或者具备实例池的代理,由于无须频繁建立代理对象,因此比较适合用CGLib动态代理技术,反之则适合用JDK动态代理技术。 CGLib不能对目标类中的final方法进行代理。