导入jar包
可以从mybatis的lib中找到asm-x.x.x.jar和cglib-x.x.x.jar
cglib的优缺点
优点:
- 基于字节码,生成真实对象的子类,运行效率高于JDK动态代理
- 不需要实现接口
缺点: - 非JDK功能,需要额外导入jar包
使用spring aop时,只要出现Proxy与真实对象转换异常,需要加上
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
true使用cglib动态代理
false使用jdk动态代理(默认)
代码
真实角色(老总)
public class Laozong {
public void chifan() {
System.out.println("eating");
}
public void mubiao() {
System.out.println("aiming");
}
}
代理角色(秘书)
public class Mishu implements MethodInterceptor{
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("预约时间");
//invoke()调用子类重写的方法
//arg1.invoke(arg0, arg2);
//arg3.invokeSuper(arg0, arg1);
Object result = arg3.invokeSuper(arg0, arg2);
System.out.println("备注");
return result;
}
}
测试
public class Women {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Laozong.class);
enhancer.setCallback(new Mishu());
Laozong laozong = (Laozong) enhancer.create();
laozong.chifan();
}
}
输出
预约时间
eating
备注