先看下结果再来分析
jdk一次增强,cglib两次增强
基础类
JDK动态代理
输出:
cglib代理
输出:
分析:
1、jdk动态代理,一次增强
jdkClient中生成的dao代理类如下,实现了IDAO,调用select方法,其实是代理类中的select方法,super.h.invoke(this, m4, (Object[])null);此处调用的是DaoJdkProxy.invoke,实际调用 对象是Dao的select方法,顺序调用insert方法,只会在调用select方法前增强一次
2、cglib代理,2次增强
根据dao生成了多个cglib.class,代理类select方法调用,90行为增强方法调用,此处的MethodInterceptor为daoProxy,select方法默认调用父类方法,即dao类中的select,父类Dao中的select方法,会调用insert,此时会调用子类insert方法,又是一次增强,再调用父类insert。
代理类中的select方法
client中加入以下行,指定代理类文件位置
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "./");