



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.2.4 CGLIB生成AopProxy代理对象在AopProxy接口实现中,可以看到使用CGLIB来生成Proxy代理对象,这个Proxy代理对象的生成,可以在Cglib2AopProxy的代码实现中看到,同样是在AopProxy的接口方法getProxy的实现完成的,如代码清单3-17所示。可以看到具体对CGLIB的使用,比如对Enhancer对象的配置,以及通过Enhancer对象生成代理对象的过程。在这个生成代理对象的过程中,需要注意的是对Enhancer对象callback回调的设置,正是通过这些callback回调,封装了Spring AOP的实现,就像我们在前面看到的JDK的Proxy对象的invoke回调方法一样;在Enhancer的callback回调设置中,实际上是通过设置DynamicAdvisedInterceptor拦截器来完成AOP功能的,如果读者感兴趣的话,可以在getCallbacks方法实现中看到回调DynamicAdvisedInterceptor的设置:1. CallbackaopInterceptor= 2. newDynamicAdvisedInterceptor(this.advised);对于这个DynamicAdvisedInterceptor中的回调实现,我们将在后面详细地进行分析。代码清单3-17 Cglib2AopProxy生成AopProxy代理对象1. publicObjectgetProxy(ClassLoaderclassLoader) 2. if(logger.isDebugEnabled() 3. logger.debug(CreatingCGLIB2proxy:target 4. sourceis+this.advised. 5. getTargetSource(); 6. 7. /从advised中取得在IoC容器中配置的target对象。 8. try 9. ClassrootClass= 10. this.advised.getTargetClass(); 11. Assert.state(rootClass!=null,Target 12. classmustbeavailablefor13. creatingaCGLIBproxy); 14. ClassproxySuperClass=rootClass; 15. if(AopUtils.isCglibProxyClass(rootClass) 16. proxySuperClass= 17. rootClass.getSuperclass(); 18. ClassadditionalInterfaces= 19. rootClass.getInterfaces(); 20. for(ClassadditionalInterface: 21. additionalInterfaces) 22. 23. this.advised.addInterface(additionalInterface); 24. 25. 26. /Validatetheclass,writinglogmessages 27. asnecessary. 28. validateClassIfNecessary(proxySuperClass); 29. /ConfigureCGLIBEnhancer. 30. / 31. 创建并配置CGLIB的Enhancer,这个Enhancer对象是CGLIB的主要操作 32. 类。 33. Enhancerenhancer=createEnhancer(); 34. if(classLoader!=null) 35. 36. enhancer.setClassLoader(classLoader); 37. if(classLoaderinstanceof38. SmartClassLoader& 39. (SmartClassLoader) 40. classLoader).isClassReloadable 41. (proxySuperClass) 42. enhancer.setUseCache(false); 43. 44. 45. /* 46. 47. *设置Enhancer对象,包括设置代理接口,回调方法,回调方法来自 48. 49. *advised的IoC配置,比如使用AOP的DynamicAdvisedInterceptor拦 50. 截器。 51. */52. enhancer.setSuperclass(proxySuperClass); 53. enhancer.setStrategy(new54. UndeclaredThrowableStrategy(UndeclaredThrowable 55. Exception.class); 56. 57. enhancer.setInterfaces(AopProxyUpleteProxiedInterfac 58. es(this.advised); 59. 60. enhancer.setInterceptDuringConstruction(false); 61. Callbackcallbacks= 62. getCallbacks(rootClass); 63. enhancer.setCallbacks(callbacks); 64. enhancer.setCallbackFilter(new65. ProxyCallbackFilter( 66. 67. this.advised.getConfigurationOnlyCopy(), 68. this.fixedInterceptorMap, 69. this.fixedInterceptorOffset); 70. Classtypes=newClasscallbacks.length; 71. for(intx=0;xtypes.length;x+) 72. typesx=callbacksx.getClass(); 73. 74. enhancer.setCallbackTypes(types); 75. /通过Enhancer生成代理对象。 76. Objectproxy; 77. if(this.constructorArgs!=null) 78. Proxy= 79. enhancer.create(this.constructorArgTypes, 80. this.constructorArgs); 81. 82. else 83. proxy=enhancer.create(); 84. 85. returnproxy; 86. 87. catch(CodeGenerationExceptionex) 88. thrownewAopConfigException(Couldnot 89. generateCGLIBsubclassofclass+ 90. 91. this.advised.getTargetClass()+:+ 92. Commoncausesofthis93. problemincludeusingafinalclassora 94. non-visibleclass,ex); 95. 96. catch(IllegalArgumentExceptionex) 97. thrownewAopConfigException(Couldnot 98. generateCGLIBsubclassofclass+ 99. 100. this.advised.getTargetClass()+:+ 101. Commoncausesofthis102. problemincludeusingafinalclassora 103. non-visibleclass,ex); 104. 105. catch(Exceptionex) 106. /TargetSource.getTarget()failed。 107. thrownewAopConfigException(UnexpectedAOP 108. exception,ex); 109. 110. 这样,通过使用AopProxy对象封装target目标对象之后,通过ProxyFactoryBean的getObject方法得到的对象就不是一个普通的Java对象了,而是一个AopProxy代理对象。在ProxyFactoryBean中配置的target目标对象,这个时候已经不会直接暴露给应用,而是作为AOP实现的一部分。对target目标对象的方法调用会首先被AopProxy代理对象拦截,对于不同的AopProxy代理对象生成方式,会使用不同的拦截回调入口。例如,对于JDK的AopProxy代理对象,使用的是InvocationHandler的invoke回调入口;而对于CGLIB的AopProxy代理对象,使用的是设置好的callback回调,这是由对CGLIB的使用来决定的;在这些callback回调中,对于AOP实现,是通过DynamicAdvisedInterceptor来完成的,而DynamicAdvisedInterceptor的回调入口是intercept方法。通过这一系列的准备,已经为实现AOP的横切机制奠定了基础,在这个基础上,AOP的Advisor已经可以通过AopProxy代理对象的拦截机制,对需要它进行增强的target目标对象发挥切面的强大威力了。可以把AOP的实现部分看成由基础设施准备和AOP运行辅助这两个部分组成。这里的AopProxy代理对象的生成,可以看成是一个静态的AOP基础设施的建立过程。通过这个准备过程把代理对象、拦截器这些待调用的部
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 畜牧业粪污处理与资源循环利用考卷考核试卷
- 2025年微波辐射计、微波散射计、测高计合作协议书
- 《内部控制评估与培训》课件
- 洪水风险图编制与应用考核试卷
- 盾构机施工中的岩土工程设计与施工优化策略研究与应用考核试卷
- 创业投资投资决策风险控制策略优化与应用实践路径探索考核试卷
- 木材的抗风化和紫外线防御考核试卷
- 2025年毛织机项目建议书
- 《活力社区展示》课件
- 【可行性报告】2025年汽轮机项目可行性研究分析报告
- 吊装安全确认表及技术交底
- 遥控器检验作业指导书
- DBJ41∕T 228-2019 河南省房屋建筑施工现场安全资料管理标准
- 三级安全教育考试试题(的)
- 生态环境执法大练兵练习(行政处罚法、新固废法、大气法)
- 芒针疗法课件
- 小学二年级下册科学课件1.《春夏秋冬》大象版(22张)ppt课件
- 第三章:船舶主机安装工艺
- 鼻咽癌放疗临床路径
- 地下水八大离子-阴阳离子平衡计算公式
- T∕CCES 23-2021 装配式多层混凝土墙板建筑技术规程
评论
0/150
提交评论