Insight 根据advisor生成Proxy过程 | AOP调用性能解疑
来源:互联网 发布:淘宝图片编辑规格 编辑:程序博客网 时间:2024/05/16 05:53
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实现:
- Insight 根据advisor生成Proxy过程 | AOP调用性能解疑
- Spring AOP proxy代理生成
- Insight spring advisor 初始化
- aop:advisor和aop:aspect
- aop:Aspect与aop:Advisor
- Insight MyBatis-Spring 解析过程,调用执行
- AOP Proxy
- Spring AOP 学习之Advisor
- spring aop 细说advice,advisor
- (14)Spring AOP Advisor
- spring的aop:advisor和aop:aspect
- <aop:aspect>与<aop:advisor>的区别
- <aop:aspect>与<aop:advisor>的区别
- 解疑性能测试之集合点
- 根据表名,自动生成增、删、改参数化存储过程和调用代码
- 解疑
- 解疑
- spring Aop中aop:advisor 与 aop:aspect的区别
- HDU 4608 I-number(YY)
- C++ Boost 解析JSON
- c++:函数传指针(void * xx)、传引用(void & xx)和传指针的引用(void *& xx)
- 在java中使用FreeMark导出数据到excel表格
- UVA 1635 Irrelevant Elements
- Insight 根据advisor生成Proxy过程 | AOP调用性能解疑
- 4种方法让SpringMVC接收多个对象
- 条款08 别让异常逃离析构函数
- Hdu 1666 敌兵布阵
- 剑指offer-第四天
- poj 3071 Football dp(概率)
- Nexus搭建的maven仓库在build.gradle文件下的代码配置,以及依赖包引用
- myeclipse项目锁定
- mysql一个字段包含多个数据的关联查询