欢迎来到天天文库
浏览记录
ID:37239657
大小:389.55 KB
页数:11页
时间:2019-05-20
《Java动态代理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、SpringAOP使用动态代理技术在运行期织入增强的代码,为了揭示SpringAOP底层的工作机理,有必要对涉及到的Java知识进行学习。SpringAOP使用了两种代理机制:一种是基于JDK的动态代理;另一种是基于CGLib的动态代理。之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理。带有横切逻辑的实例我们通过具体化代码实现上一节所介绍例子的性能监视横切逻辑,并通过动态代理技术对此进行改造。在调用每一个目标类方法时启动方法的性能监视,在目标类方法调用完成时记录方法的花费时间。代码清单6-2ForumService:包含性能监视横切代码Java代码1
2、.packagecom.baobaotao.proxy;2.publicclassForumServiceImplimplementsForumService{3.publicvoidremoveTopic(inttopicId){4.5.//①-1开始对该方法进行性能监视6.PerformanceMonitor.begin(7."com.baobaotao.proxy.ForumServiceImpl.removeTopic");8.System.out.println("模拟删除Topic记录:"+topicId);9.try{10.Thread.currentThread().s
3、leep(20);11.}catch(Exceptione){12.thrownewRuntimeException(e);13.}14.15.//①-2结束对该方法进行性能监视16.PerformanceMonitor.end();17.}18.19.publicvoidremoveForum(intforumId){20.//②-1开始对该方法进行性能监视21.PerformanceMonitor.begin(22."com.baobaotao.proxy.ForumServiceImpl.removeForum");23.System.out.println("模拟删除Forum
4、记录:"+forumId);24.try{25.Thread.currentThread().sleep(40);26.}catch(Exceptione){27.thrownewRuntimeException(e);28.}29.30.//②-2结束对该方法进行性能监视31.PerformanceMonitor.end();32.}33.}代码清单6-2中粗体表示的代码就是具有横切逻辑特征的代码,每个Service类和每个业务方法体的前后都执行相同的代码逻辑:方法调用前启动PerformanceMonitor,方法调用后通知PerformanceMonitor结束性能监视并给记录性
5、能监视结果。PerformanceMonitor是性能监视的实现类,我们给出一个非常简单的实现版本,其代码如代码清单6-3所示:代码清单6-3PerformanceMonitorJava代码1.packagecom.baobaotao.proxy;2.publicclassPerformanceMonitor{3.//①通过一个ThreadLocal保存调用线程相关的性能监视信息4.privatestaticThreadLocalperformanceRecord=5.newThreadLocal();6.7./
6、/②启动对某一目标方法的性能监视8.publicstaticvoidbegin(Stringmethod){9.System.out.println("beginmonitor...");10.MethodPerformancemp=newMethodPerformance(method);11.performanceRecord.set(mp);12.}13.publicstaticvoidend(){14.System.out.println("endmonitor...");15.MethodPerformancemp=performanceRecord.get();16.17.
7、//③打印出方法性能监视的结果信息。18.mp.printPerformance();19.}20.}ThreadLocal是将非线程安全类改造为线程安全类的法宝,在9.2节中我们将详细介绍这个Java基础知识。PerformanceMonitor提供了两个方法:通过调用begin(Stringmethod)方法开始对某个目标类方法的监视,method为目标类方法的全限定名;而end()方法结束对目标类方法的监视,并给出性能监视的信息。这两个方
此文档下载收益归作者所有