----------------------------
Aop 的开启
----------------------------
@EnableAspectJAutoProxy
通过 ImportBeanDefinitionRegistrar 接口实现 aop 入口类
AnnotationAwareAspectJAutoProxyCreator 的动态注册
----------------------------
----------------------------
Aop 代理的生成
----------------------------
容器启动的时候,有一个 BeanPostProcessor
BeanFactory.doCreateBean -->
BeanFactory.initializeBean
wrappedBean =
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
在 bean 初始化方法执行以后,AbstractAutoProxyCreator.postProcessAfterInitialization
1.收集所有的切面 (Aspect), 并封装成通知/增强器 (advisor)
2.根据 Pointcut(切点)找出当前类命中的通知/增强器 (advisor)
3.创建封装了 advisorArray 和 targetSource 的代理对象
----------------------------
----------------------------
Aop代理的执行 -- 职责链模式
----------------------------
从代理对象的 advisorArray 中找出和当前方法匹配的 advice,包装成 MethodInterceptor,生成职责链,
通过 MethodInvocation.proceed() 完成链式调用
JdkDynamicAopProxy.invoke()
ReflectiveMethodInvocation.proceed() --> this.currentInterceptorIndex
// index == 1
AspectJAroundAdvice.invoke(MethodInvocation mi)
XXX() -->
ProceedingJoinPoint.proceed() -->
ReflectiveMethodInvocation.proceed()
// index == 2
MethodBeforeAdviceInterceptor.invoke(MethodInvocation mi)
this.advice.before()
return mi.proceed() -->
ReflectiveMethodInvocation.invokeJoinpoint() --> XXX();
----------------------------