AOP的源码我计划分为四部分来学习
- 通知方法优先级源码
- 切面执行先后顺序优先级
- 判断哪些方法需要生成代理对象 + 动态代理对象的生成
- 通知方法的执行(拦截器的拦截)
在aop中,众所周知,通知方法的优先级是:Around > Before > After > AfterReturning > AfterThrowing:
这篇笔记主要记录为什么优先级是这样子的,原理是 什么样的
通知方法优先级
org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory
static {
/**
* 这里应该是定义aop通知的先后顺序
*
* 从前到后,优先级依次降低
*/
Comparator<Method> adviceKindComparator = new ConvertingComparator<>(
new InstanceComparator<>(
Around.class, Before.class, After.class, AfterReturning.class, AfterThrowing.class),
(Converter<Method, Annotation>) method -> {
AspectJAnnotation<?> annotation =
AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod(method);
return (annotation != null ? annotation.getAnnotation() : null);
});
Comparator<Method> methodNameComparator = new ConvertingComparator<>(Method::getName);
METHOD_COMPARATOR = adviceKindComparator.thenComparing(methodNameComparator);
}
在ReflectiveAspectJAdvisorFactory中,有一个静态代码块,定义了通知方法的优先级,主要是声明了一个comparator对象
其实这个比较器,可以看下是在哪里被调用的,搜索整个类,会发现,是在org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory#getAdvisorMethods
方法中被调用的,而getAdvisorMethods方法又是在org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory#getAdvisors
这个方法中被调用,我们先说到这里,先来看下具体的处理逻辑
/**
* 获取到切面的所有通知方法,并根据定义好的优先级,对通知方法进行排序;
* 需要注意:这里是对一个切面中的通知方法先进行排序
* 并将排好序之后的切面返回
* @param aspectInstanceFactory the aspect instance factory
* (not the aspect instance itself in order to avoid eager instantiation)
* @return
*/
@Override
public List<Advisor> getAdvisors(MetadataAwareAspectInstanceFactory aspectInstanceFactory) {
Class<?>