通知(Advice)
切面的具体功能和使用场景,它定义了切面的具体功能是什么以及何时被使用。Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
通知类型
在Spring中,根据使用时机的不同,将通知划分为了5种类型,下面来一个个认识下吧!
前置通知(Befor): 在目标方法被调用之前调用的通知功能。
后置通知(After): 在目标方法完成后调用的通知功能,即使在执行目标方法出现异常,也照常执行。
返回通知(After-returning): 在目标方法成功执行之后才调用通知功能。
异常通知(After-throwing): 在目标方法抛出异常后执行通知功能。
环绕通知(Around): 通知包围了目标方法,在调用目标方法前后可以执行自定义的通知功能。
连接点(Join point)
它表示在业务逻辑执行过程中能够插入切面通知的一个点。在Spring中,这个点可以是调用方法时、调用方法后、抛出异常时。 切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。
Spring AOP 是基于动态代理的,所以它只支持方法的连接点,但像其他的AOP框架如AspectJ在修改属性时或者构造器执行时都可以织入通知,达到更细颗粒度的控制拦截。
简单理解:就是方法的调用就称为连接点。
切入点(Pointcut)
通俗理解: 通知作用于哪些连接点,这个点可以称为切入点,通过上面通知介绍可知,“通知”定义了切面是"什么"和"何时使用"作用,切入点则定义了"切面"在"何处"使用。 通过配置切入点,可以将通知织入到一个或者多个连接点中。
在实际应用中,是通过指定类名称、方法名称、正则表达式进行来匹配指定切点,甚至还存在一些AOP框架允许动创建动态的切点,根据运行时的决策(如:方法的参数值)来确定是否需要使用通知增强。
简单理解:符合某种规则的连接点
切面(Aspect)
切面即切点和通知的集合,它定义了它是什么,在何时、何处完成这个功能。
Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
简单理解:狭义上的切面:一个类包含了增强的方法,和指定的规则
广义上的切面=连接点+切入点+通知
引入(Introduction)
允许向类中添加新的属性和方法,实际上就是增强类(让类拥有原来没有的功能或者属性)。 具体可以理解成将切面应用到目标类上,从而实现不修改类的代码,而让它具有新的功能和属性。
织入(Weaving)
织入是把切面应用到目标对象并创建新的代理对象的过程,这是一个动态的过程, 切面在指定的切点被织入到目标对象中,实际上在目标对象的生命周期中,存在以下的多个点可以进行织入:
1、编译期: 切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ 的织入编译器就是以这种方式织入切面的。
2、类加载期: 切面在目标类加载到 JVM 时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ 5 的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面。
3、运行期: 切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP 容器会为目标对象动态地创建一个代理对象。Spring AOP 就是以这种方式织入切面的。