Spring中PointcutAdvisor和IntroductionAdvisor梳理

本文主要关于切面Advisor、PointcutAdvisor切点切面、IntroductionAdvisor引介切面的简单介绍。

一、Advisor切面

Advisor是SpringAOP的顶层抽象,用来管理Advice和Pointcut

1、Advice也叫增强器

Spring中有五种增强:BeforeAdvide(前置增强)、AfterAdvice(后置增强)、RoundAdvice(环绕增强)、ThrowsAdvice(异常增强)、IntroductionAdvice(引介增强)。前面4种大家比较熟悉,引介增强我下面会单独说。

2、Pointcut切点

主要表达目标类或者目标方法

Advisor是继承体系主要有PointcutAdvisorIntroductionAdvisor

PointcutAdvisor与IntroductionAdvisor最本质上的区别就是

1、PointcutAdvisor是方法级别,需要用到Pointcut和Advisor。注意Pointcut可以使用任何类型的Pointcut,Advice也可以任何类型的Advice
2、IntroductionAdvisor是类级别, 只能使用IntroductionAdvice类型的Advice。

二、PointcutAdvisor-切点切面

PointcutAdvisor是切点有关的Advisor,PointcutAdvisor它的实现类非常的多

1、DefaultPointcutAdvisor —PointcutAdvisor默认实现类
2、RegexpMethodPointcutAdvisor
3、NameMatchMethodPointcutAdvisor
4、AspectJExpressionPointcutAdvisor
5、AspectJPointcutAdvisor …

下面介绍一下默认的PointcutAdvisor,它是Spring提供通用的,也被认为是最强大的Advisor。它可以把两个任意类型的Advice和Pointcut组合在一起

public class DefaultPointcutAdvisor extends AbstractGenericPointcutAdvisor implements Serializable {
    private Pointcut pointcut = Pointcut.TRUE;
    //1、无参构造
    public DefaultPointcutAdvisor() {
    }
    //2、若没有指定advice,默认Pointcut.TRUE,也就是说会匹配所有的方法的执行
    public DefaultPointcutAdvisor(Advice advice) {
        this(Pointcut.TRUE, advice);
    }
    //3、显然,这个构造函数式非常强大的~~
    public DefaultPointcutAdvisor(Pointcut pointcut, Advice advice) {
        this.pointcut = pointcut;
        setAdvice(advice);
    }
}

三、IntroductionAdvisor-引介切面

也叫引介切面,引介切面默认实现是DefaultIntroductionAdvisor,他的增强器只有IntroductionAdvice

在前面我们已经提到了前置、后置、环绕、最终、异常等增强形式,它们的增强对象都是针对方法级别的,而IntroductionAdvice-引介增强,则是对类级别的增强,我们可以通过引介增强为目标类添加新的属性和方法,可以做到不实现业务接口,并且不修改类的情况下,使其具备业务接口的功能。

在Spring中,为目标对象添加新的属性和行为必须声明相应的接口以及相应的实现,再通过特定的拦截器将新逻辑附加到目标对象上,然后目标类就拥有了新的状态和行为

所以引介切面里面主要包含下面2块内容,接口拦截器

1、Interfaces 接口集合
在使用引介切面时,我们需要告诉引介切面,为目标类添加哪些新接口,因为我们使用引介切面目的就是为目标类新增属性和方法

2、IntroductionInterceptor:引介拦截器
作用:在目标类被调用的时候,通过拦截器将新的接口附加到目标对象上。默认实现类是DelegatingIntroductionInterceptor

四、区别

PointcutAdvisor和IntroductionAdvisor接口

1、IntroductionAdvisor切点是类级别的,他只有类过滤器ClassFilter,没有MethodMatcher。

2、PointcutAdvisor的切点是方法级别的,维度更细

实现结构图

Spring中PointcutAdvisor和IntroductionAdvisor梳理_第1张图片

你可能感兴趣的:(Spring整理后,spring,增强器,引介增强,Advisor)