返回

Spring 源码阅读 52:解构注解配置的切面增强逻辑(二) - 寻找增强方法

后端

在 Spring 中,基于注解的切面配置可以非常灵活地定义增强逻辑。这种配置方式需要在切面类中使用 @Aspect 注解声明该类是一个切面,同时,也可以使用其他注解(如 @Before、@After、@Around)来定义增强逻辑。当 Spring 容器启动时,它会扫描这些注解配置的切面类,并从中提取增强逻辑信息。

本文将详细分析 Spring 如何在获取到基于注解的切面配置类之后,从中找到配置增强逻辑的方法。

获取切面类中配置的增强逻辑

Spring 在获取到切面类之后,会调用 AnnotationAspectJAdvisorFactory.getAdvisorMethods() 方法来获取切面类中配置的增强逻辑。

public Advisor[] getAdvisorMethods(MetadataAwareAspectInstanceFactory aaif) {
    ...
    List<Advisor> advisors = new ArrayList<>();
    ...
    Method[] methods = aac.getDeclaredMethods();
    ...
    for (Method method : methods) {
        ...
        advisorMethod = getAdvisorMethod(method, aac);
        if (advisorMethod != null) {
            advisors.add(advisorMethod);
        }
        ...
    }
    ...
    return advisors.toArray(new Advisor[0]);
}

该方法首先获取切面类中声明的所有方法,然后遍历这些方法,并为每个方法调用 getAdvisorMethod() 方法来获取增强逻辑信息。

private Advisor getAdvisorMethod(Method method, Class<?> targetClass) {
    ...
    Advisor advisor = new ReflectiveMethodInvocationAdvisor(
            method, aac, targetClass, getAdviceType(method), aac.getPerClausePointcut());
    ...
    return advisor;
}

getAdvisorMethod() 方法首先创建一个 ReflectiveMethodInvocationAdvisor 对象,该对象表示一个增强逻辑的通知方法。然后,它调用 getAdviceType() 方法来获取增强逻辑的类型,并调用 getPerClausePointcut() 方法来获取增强逻辑的切点。

创建 Advisor 对象

Spring 在获取到切面类中配置的增强逻辑信息之后,会为每一个增强逻辑创建一个 Advisor 对象。Advisor 对象包含了增强逻辑的信息,它可以被用于在 Spring AOP 框架中创建代理对象。

Advisor 对象的创建过程主要是在 AnnotationAspectJAdvisorFactory.getAdvisor() 方法中完成的。该方法首先获取切面类中配置的增强逻辑信息,然后根据这些信息创建 Advisor 对象。

public Advisor getAdvisor(Method m, Class<?> targetClass, AspectJExpressionPointcut ajexp) {
    ...
    PerClausePosition pcpos = m.getAnnotation(PerClause.class);
    PerClausePointcut perClausePointcut = null;
    if (pcpos != null) {
        perClausePointcut = new PerClausePointcut(
                pcpos.pointcut(), targetClass, m.getName());
    }
    ...
    Advisor advisor = new ReflectiveMethodInvocationAdvisor(
            m, aac, targetClass, getAdviceType(m), perClausePointcut);
    ...
    return advisor;
}

该方法首先获取增强逻辑的方法的注解信息,然后根据这些注解信息创建 Advisor 对象。

总结

本文详细分析了 Spring 如何在获取到基于注解的切面配置类之后,从中找到配置增强逻辑的方法。通过本文的分析,你可以更深入地了解 Spring AOP 的实现原理。