



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.4 Spring AOP的高级特性了解了Spring AOP的基本实现,下面我们来看一个关于使用Spring AOP高级特性的例子,来了解它的实现原理。在使用Spring AOP时,对目标对象的增强是通过拦截器来完成的。对于一些应用场合,需要对目标对象本身进行一些处理,比如,如何从一个对象池或对象工厂中获得目标对象等。这样,我们需要使用Spring的TargetSource接口特性,在这里,我们把这类AOP特性当作高级特性的一种,从这些AOP特性的实现原理的了解上,可以看到对AOP基本特性的灵活运用。在Spring中,提供了许多现成的TargetSource实现,比如下面的HotSwappableTarget-Source,这个HotSwappableTargetSource使得用户可以以线程安全的方式切换目标对象,提供所谓的热交换功能。这个特性是很有用的,尽管它的开启需要AOP应用进行显式的配置。但这个配置并不复杂,在使用时只需要把这个HotSwappableTargetSource配置到ProxyFactoryBean的target属性就可以了,在需要更换真正的目标对象时,调用HotSwappableTargetSource的swap方法就可以完成。由此可见,对HotSwappableTargetSource的热交换功能的使用,是需要触发swap方法调用的。这个swap方法的实现很简单,它完成target对象的替换,也就是说,它使用新的target对象来替换原有的target对象。为了保证线程安全,需要把这个替换方法设为synchronized方法,如代码清单3-34所示。代码清单3-34 HotSwappableTargetSource的swap方法1. publicsynchronizedObjectswap(ObjectnewTarget) 2. throwsIllegalArgumentException 3. Assert.notNull(newTarget,Targetobjectmustnotbenull); 4. Objectold=this.target; 5. this.target=newTarget; 6. returnold; 7. 8. publicsynchronizedObjectgetTarget() 9. returnthis.target; 10. 这个target是怎样在AOP中起作用的呢?了解一下对getTarget的调用就很清楚了,这个HotSwappableTargetSource只是对真正的target做了一个简单的封装,以提供热交换的能力,并没有其他特别之处。对getTarget的方法调用关系,如图3-12所示。我们以JdkDynamicAopProxy的实现为例子,可以看到在AOP对Proxy代理对象进行invoke方法调用的时候,会使用这个getTarget调用取得真正的目标对象,如果已经调用过swap方法完成目标对象的热交换,那么交给AOP的已经是交换后的目标对象了,如代码清单3-35所示。具体来说,在invoke方法中,我们看到代理对象的取得,是在AopProxy代理对象的拦截器起作用之前,通过targetSource.getTarget()的调用来取得的,而这个代理对象是否被更换过,是由对swap方法的调用来负责的。因而,在invoke方法中,可以看到对于使用了什么样的代理对象,都不会对拦截器的行为做任何的改变。代码清单3-35 invoke获取目标对象1. target=targetSource.getTarget(); 2. if(target!=null) 3. targetClass=target.getClass(); 4. 5. /Gettheinterceptionchainforthismethod. 6. /这里获得定义好的拦截器链。 7. Listchain= 8. this.advised.getInterceptorsAndDynamicInterceptionAdvice 9. (method,targetClass); 10. /* 11. *Checkwhetherwehaveanyadvice.Ifwedont,wecan 12. fallbackondirect 13. *reflectiveinvocationofthetarget,andavoidcreatinga 14. MethodInvocation. 15. */16. /如果没有设定拦截器,那么就直接调用target的对应方法。 17. if(chain.isEmpty() 18. /* 19. *WecanskipcreatingaMethodInvocation:just 20. invokethetargetdirectly 21. *Notethatthefinalinvokermustbean 22. InvokerInterceptorsoweknowitdoes 23. *nothingbutareflectiveoperationonthetarget, 24. andnohotswappingor 25. *fancyproxying. 26. */27. retVal= 28. AopUtils.invokeJoinpointUsingReflection(target,method, 29. args); 30. 31. else 32. /Weneedtocreateamethodinvocation. 33. / 34. 如果有拦截器的设定,那么需要调用拦截器之后才调用目标对象的相 35. 应方法。 36. /通过构造一个ReflectiveMethodInvocation来实现。 37. invocation=newReflectiveMethodInvocation(proxy,target, 38. method,args,targetClass, 39. chain); 40. /Proceedtothejoinpointthroughtheinterceptor 41. chain. 42. retVal=ceed(); 43. 44. /Massagereturnvalueifnecessary. 45. if(retVal!=null&retVal=target& 46. method.getReturnType().isInstance(proxy)& 47. !RawTargetAccess.class.isAssignableFrom(method.getDe 48. claringClass() 49. /* 50. *Specialcase:itreturnedthisandthereturn 51. typeofthemethod 52. *istype-compatible.Notethatwecanthelpifthe 53. targetsets 54. *areferencetoitselfinanotherreturnedobject. 55. */56. retVal=proxy; 57. 58. r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度专业保洁公司保洁用品及清洁剂采购合同
- 二零二五年度建筑工程资料审核与承包服务合同
- 2025版货车租车及驾驶员职业规划与晋升服务合同
- 2025版旅游产业人民币担保书
- 二零二五年度电商园区品牌推广与宣传服务合同
- 2025版楼梯口拆除改造与社区安全防范体系建设合同
- 二零二五版跨境电子商务支付安全协议及信用保障合同
- 2025至2030年中国智能服饰行业市场全景评估及发展战略规划报告
- 早期股骨头坏死课件
- 二零二五年度电梯销售与售后服务合同范本
- 全面质量管理TQM体系概述与实践应用探讨
- 2025年云南省事业单位招聘考试教师信息技术学科专业知识试卷试题
- 借款转为租金合法合同范本
- 2025年电子商务师(职业资格专业初级)考试试卷及答案
- 海姆立克急救法科普知识
- 《中医体重管理临床指南》
- (高清版)JTGT 3360-01-2018 公路桥梁抗风设计规范
- 品管圈成果汇报——提高导管固定正确率PPT课件
- 红金简约风教师退休欢送会PPT通用模板
- 水准点复测记录(自动计算表)
- 商用车背车装载技术要求
评论
0/150
提交评论