锁定老帖子 主题:AOP的实现机制
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-18
加深了对aop的理解和记忆,知其原理方可熟练使用,多谢楼主的悉心整理总结
|
|
返回顶楼 | |
发表时间:2011-10-19
感谢lz提供
|
|
返回顶楼 | |
发表时间:2011-10-19
楼主,图是用什么工具画的?请教
|
|
返回顶楼 | |
发表时间:2011-10-19
rentianchou 写道 楼主,图是用什么工具画的?请教
用Word和Word的SmartArt插件。 |
|
返回顶楼 | |
发表时间:2011-10-19
这个不会把spring的aop重新实现了一遍吧
|
|
返回顶楼 | |
发表时间:2011-10-19
想了解一下 lz是用什么工具画的图
|
|
返回顶楼 | |
发表时间:2011-10-19
资料整理的很好,特别的全。。。
|
|
返回顶楼 | |
发表时间:2011-10-19
peak 写道 这个不会把spring的aop重新实现了一遍吧
文中的最后两个实现机制,性能要比目前Spring的实现机制更好。 |
|
返回顶楼 | |
发表时间:2011-10-19
楼主辛苦了
|
|
返回顶楼 | |
发表时间:2011-10-19
最后修改:2011-10-19
根据你上边说的我大胆猜测性能应该是这个顺序的吧,instrument>javassit>cglib>jdk 动态代理
但是为什么sping默认实现是jdk的动态代理呢,我的册数数据确实jdk的动态代理性能更好点啊,不知lz有没有测试数据,可以比较一下性能差别,这样也好以后有个比对吧。 以下是你附件的性能测试数据,我加了个javassit的 public class PerformanceTest { public static void main(String[] args) throws NotFoundException, CannotCompileException, InstantiationException, IllegalAccessException { int n=1000; long start = System.currentTimeMillis(); for(int i=0;i<1000;i++) JavassistAopDemo.aop(); long end = System.currentTimeMillis(); long javassistNeedTime = end - start; start = System.currentTimeMillis(); for(int i=0;i<1000;i++) DynamicProxyDemo.aop(); end = System.currentTimeMillis(); long dynamicProxyNeedTime = end - start; start = System.currentTimeMillis(); for(int i=0;i<1000;i++) ProxyBusiness.staticDynamic(); end = System.currentTimeMillis(); long staticProxyNeedTime = end - start; start = System.currentTimeMillis(); for(int i=0;i<1000;i++) CglibAopDemo.byteCodeGe(); end = System.currentTimeMillis(); long byteCodeGeNeedTime = end - start; System.out.println("dynamicProxy need time:" + dynamicProxyNeedTime + "ms"); System.out.println("staticDynamic need time:" + staticProxyNeedTime + "ms"); System.out.println("byteCodeGe need time:" + byteCodeGeNeedTime + "ms"); System.out.println("javassist need time:" + javassistNeedTime + "ms"); } } dynamicProxy need time:61ms staticDynamic need time:46ms byteCodeGe need time:139ms javassist need time:139ms package jsvassist; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.NotFoundException; import javassist.Translator; import model.Business; /** * 使用Javassist演示Aop的Demo. * * @author tengfei.fangtf */ public class JavassistAopDemo { // public static void main(String[] args) throws Exception { // aop(); // } static ClassPool cp=null; static CtClass cc = null; //获得指定方法名的方法 static CtMethod m = null; static Class class1 = null; //在方法执行前插入代码 static { try { cp = ClassPool.getDefault(); cc = cp.get("model.Business"); m = cc.getDeclaredMethod("doSomeThing"); m.insertBefore("{ System.out.println(\"记录日志\"); }"); class1 = cc.toClass(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }} public static void aop() throws NotFoundException, CannotCompileException, InstantiationException, IllegalAccessException { //获取存放CtClass的容器ClassPool // //创建一个类加载器 // Loader cl = new Loader(); // //增加一个转换器,让类加载的时候 // cl.addTranslator(cp, new MyTranslator()); // //将类装载到JVM // try { // cl.run("jsvassist.JavassistAopDemo$MyTranslator", null); // } catch (Throwable e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } ((Business)class1.newInstance()).doSomeThing(); } public static class MyTranslator implements Translator { public void start(ClassPool pool) throws NotFoundException, CannotCompileException { } /* * * 类装载到JVM前进行代码织入 */ public void onLoad(ClassPool pool, String classname) { if (!"model.Business".equals(classname)) { return; } //通过报名获取类文件 try { CtClass cc = pool.get(classname); //获得指定方法名的方法 CtMethod m = cc.getDeclaredMethod("doSomeThing"); //在方法执行前插入代码 m.insertBefore("{ System.out.println(\"记录日志\"); }"); } catch (NotFoundException e) { } catch (CannotCompileException e) { } } public static void main(String[] args) { Business b = new Business(); b.doSomeThing2(); b.doSomeThing(); } } } |
|
返回顶楼 | |