论坛首页 Java企业应用论坛

AOP的实现机制

浏览 129905 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-10-18  
加深了对aop的理解和记忆,知其原理方可熟练使用,多谢楼主的悉心整理总结
0 请登录后投票
   发表时间:2011-10-19  
感谢lz提供
0 请登录后投票
   发表时间:2011-10-19  
楼主,图是用什么工具画的?请教
0 请登录后投票
   发表时间:2011-10-19  
rentianchou 写道
楼主,图是用什么工具画的?请教

用Word和Word的SmartArt插件。
0 请登录后投票
   发表时间:2011-10-19  
这个不会把spring的aop重新实现了一遍吧
0 请登录后投票
   发表时间:2011-10-19  
想了解一下 lz是用什么工具画的图
0 请登录后投票
   发表时间:2011-10-19  
资料整理的很好,特别的全。。。
0 请登录后投票
   发表时间:2011-10-19  
peak 写道
这个不会把spring的aop重新实现了一遍吧

文中的最后两个实现机制,性能要比目前Spring的实现机制更好。
0 请登录后投票
   发表时间:2011-10-19  
楼主辛苦了
0 请登录后投票
   发表时间: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();
        }
    }

}


0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics