对SpringAop的思考之基于cglib的动态代理

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


你可能感兴趣的:(java,AOP)