概述
面向方面编程(AOP)也可叫做面向切面编程,是一种编程范式,用于完善面向对象编程(OOP),是Spring两大特征之一(IoC和AOP)
OOP基于组件(类)进行开发,然后对组件进行组合,无法解耦组件进行开发
基本概念
连接点(Joinpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化、方法执行、方法调用、字段调用或者异常处理等等,Spring只支持方法执行的连接点
切入点(Pointcut):选择一组相关连接点的模式,即可以认为连接点的集合,Spring支持perl5正则表达式和AspectJ切入点模式,Spring默认使用AspectJ语法
通知(Advice):在连接点上执行的行为,通知提供了在AOP需要在切入点所选择的连接点处进行扩展现有行为的手段,包括前置通知(before advice)、后置通知(after advice)、环绕通知(around advice)、在Spring中通过代理模式实现AOP、并通过拦截器模式以环绕连接点的拦截器链织入通知
切面(Aspect):横切关注点的模块化。可以认为是通知、引入和切入点的组合;在Spring中可以使用Schema和@AspectJ方式进行组织实现
引入(inter-type declaration):也成为内部类型声明。为已有的类添加额外新的字段或者方法,Spring允许引入新的接口(必须对应一个实现)到所有被代理对象(目标对象)
目标对象(Target Object):需要被织入横切关注点的对象,即对象是切入点选择的对象,需要被通知的对象,从而也可以成为“被通知对象”;由于Spring AOP通过代理模式实现,从而这个对象永远是被代理对象
AOP代理(AOP proxy):AOP框架使用代理模式创建对象,从而实现在连接点处插入通知(应用切面),就是通过代理来对目标对象应用切面。Spring中,AOP代理可以用JDK动态代理或者CGLIB代理实现,而通过拦截器模型应用切面
织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期,类装载期,运行期进行
通知类型
- 前置通知
在切入点选择的连接点处的方法之前执行的通知,该通知不影响程序正常执行流程(除非该通知抛出异常,该异常将中断当前方法链的执行而返回) - 后置通知
在切入点选择的连接点处的方法之后执行的通知,包括以下
- 后置返回通知
在切入点选择的连接点处的方法正常执行完毕时执行的通知,必须是连接点处的方法没有抛出任何异常,正常返回时才调用后置通知 - 后置异常通知
在切入点选择的连接点处的方法抛出异常返回时执行的通知,必须是连接点处的方法抛出任何异常,返回时才调用后置通知 - 后置最终通知
在切入点选择的连接点处的方法返回时执行的通知,不管有没有抛出异常都执行
- 后置返回通知
- 环绕通知
环绕着在切入点选择连接点处的方法所执行的通知,环绕通知可以在方法调用之前和之后定义任何行为,并且可以决定时候执行连接点处的方法,替换返回值,抛出异常等等
AOP代理
AOP代理就是AOP框架通过代理模式创建的对象,Spring使用JDK动态代理或者CGLIB代理来实现,Spring缺省(默认)使用JDK动态代理来实现,从而任何接口都可被代理,如果被代理的对象实现不是接口将默认使用CGLIB代理(CGLIB动态代理),不过CGLIB代理当然也可应用到接口。