说完基于jdk的动态代理,来说说基于cglib的动态代理吧。
首先创建目标类:
public class GreetImp {
public void sayHello(String name) {
// TODO Auto-generated method stub
System.out.println("hello"+name);
}
}
接着,我们来写基于cglib的动态代理类吧
public class DyemCglibProxy implements MethodInterceptor{
private static DyemCglibProxy dyemCglibProxy=new DyemCglibProxy();
private DyemCglibProxy()
{
}
public static DyemCglibProxy getInstance()
{
return dyemCglibProxy;
}
public <T> T getProxy(Class clazz)
{
return (T) Enhancer.create(clazz, this);
}
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
Object result;
System.out.println("调用前");
result=arg3.invokeSuper(arg0,arg2);
System.out.println("调用后");
return result;
}
}
我们对这个代理类做了一下处理,让我们的这个代理类变成单例。通过以下代码进行代理。
public static void main(String[] args) {
Greeting g=DyemCglibProxy.getInstance().getProxy(GreetImp.class);
g.sayHello("小明");
}
那么,这基于jdk的动态代理和基于cglib的动态代理的区别到底在哪呢?
我们可以比较下这两种代理所代理的目标类的区别,基于jdk的动态代理所代理的目标类实现接口,而基于cglib的动态的目标类去没有实现接口,只是单纯的类。由此,是不是觉得基于cglib的动态代理是不是更加强大一点啊。
问题来了,既然cglib动态代理比jdk代理强大,为什么cglib的动态代理却不能取代jdk的动态代理呢?据一位大牛说,CGLib创建代理的速度比较慢,但创建代理后运行的速度却非常快,而jdk的代理却相反。如果在运行的时候不断的用CGLib去创建代理,系统的性能会大大的降低,所以建议一般在系统初始化的时候用CGLib去创建代理,并放入Spring的ApplicationContext中以备后用。