代理对象的调用流程
2020-08-29 15:05:55 0 举报
代理对象
作者其他创作
大纲/内容
ReflectiveMethodInvocation
1、从代理工厂实例中获取TargetSource对象
代理类存在在jvm内存中
3、根据被调用方法和类从代理工厂实例中的切面集合中找到合适的Advice集合,这里注意一下把AspectJMethodBeforeAdvice AspectJAfterReturningAdvice这两种类型的advice包装成MethodInterceptor类型的advice
JdkDynamicAopProxy
proceed
$Proxy0 implements UserService
+ addxx(params) { h.invoke()}
advice增强集合
1、反射调用advice中包装的method对象,就是有@before注解的方法
currentInterceptorIndex==1
interceptorsAndDynamicMethodMatchers
currentInterceptorIndex==0
...
MethodBeforeAdviceInterceptor
userService是代理实例,采用的是jdk的动态代理,那么就会调到invocationHandler接口类型的类的invoke方法,在spring中这个类就是:JdkDynamicAopProxy
2、从TargetSource对象中获取target对象,就是被代理对象
currentInterceptorIndex == interceptorsAndDynamicMethodMatchers.size() - 1
after
5、如果获取到的advice集合不为空,则链式调用增强
userService.addxx(\"1\")
根据索引currentInterceptorIndex控制调用链中的哪一个advice
4、如果获取到的advice集合为空,则直接调用被代理方法,说明该方法没被拦截不需要增强
2、火炬传递,又调回ReflectiveMethodInvocation类中的proceed方法
如果currentInterceptorIndex == interceptorsAndDynamicMethodMatchers.size() - 1.则说明集合中没有需要调用的增强了,则反射调用被代理方法
around
invoke
before
1、反射调用advice实例中包装的method对象,其实就是有@Around注解的方法。在方法中完成了火炬传递,joinPoint.proceed()
AspectJAroundAdvice
0 条评论
回复 删除
下一页