图解 Spring AOP 原理 源码 主流程 时序图

【AOP】

核心类:MethodInterceptor|invoke()、MethodInvocation|proceed()串联了整个Interceptor调用链
入口:AbstractAutowireCapableBeanFactory的doCreateBean()

1、创建代理类

1-1:doCreateBean()–>initializeBean()
初始容器创建的Bean实例对象,为其添加BeanPostProcessor后置处理器。

1-2:initializeBean()–>applyBeanPostProcessorsAfterInitialization()
对BeanPostProcessor后置处理器的postProcessAfterInitialization,回调方法的调用,为Bean实例初始化之后做一些处理。

1-3:applyBeanPostProcessorsAfterInitialization()–>wrapIfNecessary()–>getAdvicesAndAdvisorsForBean()
获取Bean所有的通知,进行判断有没有通知(specificInterceptors != DO_NOT_PROXY)。

1-4:getAdvicesAndAdvisorsForBean()–>findEligibleAdvisors()–>sortAdvisors()
进行通知排序。

1-5:wrapIfNecessary()–>createProxy()–>proxyFactory.getProxy()–>createAopProxy()
该方法判断是否是接口,是:先用JDK代理,否:CGLib代理

1-6:proxyFactory.getProxy()–>createAopProxy().getProxy(classLoader)
根据AopProxy具体类型调用不同实现的getProxy();并返回具体的代理对象

2、代码织入

入口:JdkDynamicAopProxy的invoke()
2-1:invoke()–>this.advised.getInterceptorsAndDynamicInterceptionAdvice()
获取拦截器链(所有需要织入代码的逻辑)

2-2:invoke()–>invocation = new ReflectiveMethodInvocation()
invoke()–>invocation.proceed()进行递归,该方法中执行责任链中所有的Interceptor

3、通知

3-1:proceed()–>MethodBeforeAdviceInterceptor的invoke();中this.advice.before();
在proceed();之前执行

3-2:proceed()–>AfterReturningAdviceInterceptor的this.advice.afterReturning();
在proceed();之后执行

时序图

在这里插入图片描述
在这里插入图片描述

xmind

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值