AOP介绍
AOP是(Aspect Orient Programing)的简称,即:面向切面编程。
AOP的术语
Joinpoint:连接点,通知执行的具体位置,如方法执行前,方法后,异常抛出后等。Spring只实现了方法的AOP,所以Spring的连接点就在方法周围发生。
Advice:通知,是植入到目标连接点上的程序代码。Spring中提供的通知有 BeforeAdvice、AfterReturnAdvice、ThrowsAdvice等。从名字上看,就能看出他们发挥作用的场景。
PointCut:切点,负责定位连接点的位置,负责匹配连接点,因为每个方法都有连接点,但是哪方法的连接点上使用什么通知,需要用切点来描述。Spring中有专门的接口来对应这个概念。
Weaving:织入,将通知添加在具体的连接点上的过程。AOP有三种织入方式,编译期、类装载期、运行期,Spring采用运行期使用动态代理织入。
Aspect:切面,由切点和通知、连接点的定义。
SpringAOP
SpringAop是AOP技术在Spring中的具体实现。SpringAOP构建在IOC之上,使用动态代理技术在运行期间对类进行方法级别上做了增强。所以Spring的AOP实际上是对目标类进行了代理,通过生成目标类的代理类,并在代理类中加入了增强的通知功能,完成了切面的功能。程序实际上执行的是Spring生成的代理类。
Spring AOP创建代理类
Spring创建代理类,通过ProxyFactory 和ProxyFactoryBean创建,ProxyFactory需要使用编程的方式设置AOP,而ProxyFactoryBean可以使用配置的方式处理AOP配置。
它们的关系和BeanFactory和ApplicationContext类似。一个是编程配置,一个是xml配置。但有不相同,下面看一下它们的继承关系。
ProxyFactory和ProxyFactoryBean都实现了相同的父类,还有AspectJProxyFactory是针对Spring集成AspectJ来使用的工厂类。
Spring AOP的两种代理机制
1、基于JDK动态代理。
基于反射的动态代理技术,它能通过接口创建代理实例。同时在方法调用前后加入增强逻辑。
2、基于CGLib的动态代理。
由于JDK创建代理必须要求被代理类有实现一个接口,对与没有接口的类,就没有办法生成代理类。这时Spring引入了CGLIB,它采用的字节码生成技术,直接创建目标类的子类,并在子类方法中拦截父类方法的调用,实现功能的增强。
Spring的通知类型接口
Spring集中定义了5种类型的通知。它们是
BeforeAdvice:前置通知,目标方法执行前的通知。
AfterReturnAdvice:后置通知,目标方法执行后的通知。
ThrowsAdvice:异常通知,目标方法抛出异常后的通知。
MethodInterceptor:环绕拦截器,在目标方法执行前后的通知。
IntroductionInterceptor:引介拦截器,给目标类添加新的方法和属性。
其中,MethodInterceptor,IntroductionInterceptor是AOP联盟定义的接口。
Spring AOP中其他概念
Advisor:通知器,Spring使用通知器将Advice和PointCut结合起来,对应AOP切面的概念。
拦截器:Spring配置切面,调用通知的地方,实际上就是在具体方法调用时,做拦截并调用切面方法。
Spring AOP的执行流程
下面是Spring AOP执行的流程图:
关于AdviceAdapter包装Advice见《Spring中的设计模式-适配器模式 》