Insight 根据advisor生成Proxy过程 | AOP调用性能解疑

来源:互联网 发布:淘宝图片编辑规格 编辑:程序博客网 时间:2024/05/16 05:53

疑问: 1、context 如何根据bean-factory中的advisor 生成proxy(比如@Aspect Advice作用在指定的方法)

2.AOP对方法执行性能的影响是怎样的(Proxy 的生成时机?、方法执行会动态匹配Advice ?)

...

需要明确的是:

a.spring初始化的过程中,BeanFactory.initializeBean会在post-bean 阶段委托bean-post-processor进行处理。

b.关于是否生成AOP代理由bean-post-processor: AbstractAutoProxyCreator完成。

...

processor调用postProcessAfterInitialization、wrapIfNecessary,关键处理如下所示:

...

委托CglibAopProxy生成代理类(此时,class已经生成),Proxy class列表如下:


-------------------------------------------------------------------------------------------------------------------

涉及到AOP方法的调用:
入口 CglibAopProxy$DynamicAdvisedInterceptor.intercept()
构造MethodInvocation,委托method进行targetClass 方法调用。interceptors信息全部在proxy (反编译导出的代理类,不如debug 过程中看的清楚)
retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();
在调用过程中可以看到,在Spring 容器的初始化过程中,随着bean的初始化,代理类提前完成生成、初始化。不会在方法执行过程中再做这些事情,调用过程中只有invokeJoinpointUsingReflection();


结论:

1.参考AbstractAutowireCapableBeanFactory.initializeBean(),Bean初始化过程-AfterPost阶段,会有APC.wrapProxyIfNecessary的过程,此时会查找匹配的Advice并生成Proxy instance,最后将proxy 暴露给bean-factory。

2.注入的bean就是上述的Proxy instance,正常方法调用时,由Proxy类发起调用,根据Advice 的类型,决定调用的顺序,没有动态匹配Advisor过程,性能的影响主要是invokeUsingReflection造成的。

method.invoke(target, args)

3.Advice方法Class内部调用,interceptor不会生效,从Proxy class 列表看,是由完全不同的类发起调用,只是从源码中无法感知。

4.Java查看动态代理生成的代码 http://www.cnblogs.com/ctgulong/p/5011614.html


附带AopProxyFactory实现:





0 0
原创粉丝点击