图解 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();之后执行

时序图

图解 Spring AOP 原理 源码 主流程 时序图_第1张图片
图解 Spring AOP 原理 源码 主流程 时序图_第2张图片

xmind

图解 Spring AOP 原理 源码 主流程 时序图_第3张图片

你可能感兴趣的:(Spring,aop,spring,java)