Spring 源码阅读 52:解构注解配置的切面增强逻辑(二) - 寻找增强方法
2023-11-08 23:11:51
在 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 的实现原理。