简介
AOP面向切面编程是面向对象的一种补充。切面(Aspect)封装与业务无关但是对对象产生逻辑影响可宠用模块。
实现方式【静态代理与动态代理生成AOP代理对象的时机不同】
AspectJ是静态代理:在编译阶段生成AOP代理类,AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。
Spring AOP是动态代理:不修改字节码,每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
① JDK动态代理只提供接口的代理,不支持类的代理,要求被代理类实现接口。
② 代理类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。
名词
连接点(Join point):指程序运行过程中所执行的方法。
切面(Aspect):被抽取出来的公共模块,可以用来会横切多个对象。Aspect切面可以看成 Pointcut切点 和 Advice通知 的结合,一个切面可以由多个切点和通知组成。
切点(Pointcut):切点用于定义 要对哪些Join point进行拦截。
通知(Advice):指要在连接点(Join Point)上执行的动作。
目标对象(Target):包含连接点的对象,也称作被通知(Advice)的对象。
织入(Weaving):通过动态代理,在目标对象(Target)的方法(即连接点Join point)中执行增强逻辑(Advice)的过程。
引入(Introduction):添加额外的方法或者字段到被通知的类。
通知(Advice)类型
前置通知(Before Advice):在连接点(Join point)之前执行的通知。
后置通知(After Advice):当连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
环绕通知(Around Advice):包围一个连接点的通知,这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
返回后通知(AfterReturning Advice):在连接点正常完成后执行的通知(如果连接点抛出异常,则不执行)。
抛出异常后通知(AfterThrowing advice):在方法抛出异常退出时执行的通知。