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