Spring jdk动态代理方法执行逻辑
2022-04-17 18:21:17 0 举报
Spring jdk动态代理方法执行逻辑
作者其他创作
大纲/内容
就执行动态参数的匹配methodMatcher.matches
判断ProxyFactory的exposeProxy=true
调用invocation.proceed()
判断当前的执行类与方法是否满足此Advisor的匹配规则
执行代理方法userService.test()
执行下一个Interceptor
从缓存中获取Advice链
不是
匹配
没有获取到
获取到返回的Advice chain
ThrowsAdvice封装成ThrowsAdviceInterceptor
是
根据当前执行的方法,筛选出匹配的Advisor并且封装成Interceptor
不是就直接加入
把Advisor适配成对应的Interceptor
拿到被代理的对象Target
无论是不是
添加
MethodInterceptor不操作
获取所有的Advice,也就是Interceptor进行遍历
判断是不是需要运行时校验MethodMatcher#isRuntime()
调用链为空就直接执行该方法
为空
MethodBeforeAdvice封装成MethodBeforeAdviceInterceptor
执行完所有的前置比如before增强后,再会执行原始方法,比如test()方法的逻辑,最后再返回递归执行after增强等
JdkDynamicAopProxy#invoke()方法
执行当前Interceptor.invoke()
进入筛选方法
把所有的Interceptor包装成InterceptorAndDynamicMethodMatcher
比如AfterReturningAdviceInterceptor#invoke()方法会先执行mi.proceed();方法,再执行advice定义的方法public Object invoke(MethodInvocation mi) { Object retVal = mi.proceed(); // font color=\"#e57373\
会进行递归执行
不匹配
interceptorList
判断当前方法是不是hashcodeequals等等
判断是不是需要运行时判断
拿到所有的Advisor,这个在ProxyFactory一开始创建的时候就添加了proxyFactory.addAdvisor(new KyriePointAdvisor());
返回
获取到值
AfterReturningAdvice封装成AfterReturningAdviceInterceptor
代理对象设置进ThreadLocalAopContext.setCurrentProxy(proxy)可以在代理方法里面拿到代理对象
判断是否是这个类型InterceptorAndDynamicMethodMatcher
直接执行该方法不走代理逻辑
遍历每一个Advisor
放入缓存中methodCache
收藏
收藏
0 条评论
回复 删除
下一页