说完基于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; } publicT 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中以备后用。