SpringAop源码一:通知方法优先级

AOP的源码我计划分为四部分来学习

  1. 通知方法优先级源码
  2. 切面执行先后顺序优先级
  3. 判断哪些方法需要生成代理对象 + 动态代理对象的生成
  4. 通知方法的执行(拦截器的拦截)

在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<?> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值