cglib动态代理

Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,

之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。

切入点一般是方法调用之前,之后或者两端。

1、要代理的类

package com.yt.manager.proxy;

public class ServicesImpl {

	public void outPut() {
		// TODO Auto-generated method stub
		System.out.println("to run outPut method..............");
	}

	public void putOut() {
		// TODO Auto-generated method stub
		System.out.println("to run putOut method..............");
	}

	public void outPut1(String v) {
		System.out.println("参数内容:" + v);
	}

}

2、cglib代理类

package com.yt.manager.proxy;

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * cglib动态代理 intercept(Object obj, Method method, Object[] args,MethodProxy
 * proxy) 是CGLib定义的Inerceptor接口的方法,obj表示代理后的子类 , method为父类方法的反射对象,args为方法的动态入参,
 * 而proxy为代理类实例。一般使用 proxy进行调用父类方法,这样更快。
 * @author zxf
 * 
 */
public class CGlibProxyFactory implements MethodInterceptor {

	private Enhancer enhancer = new Enhancer();

	public Object getProxy(Class c) {
		enhancer.setSuperclass(c); // ① 设置需要创建子类的类
		enhancer.setCallback(this);
		return enhancer.create(); // ②通过字节码技术动态创建子类实例
	}

	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		before();
		arg3.invokeSuper(arg0, arg2);
		end();
		return null;
	}

	public void before() {
		System.out.println("--------在调用要代理类的方法前做的处理----------");
	}

	public void end() {
		System.out.println("--------在调用要代理类的方法后做的处理----------");
	}

}

3、测试调用

package com.yt.manager.proxy;

/**
 * 调用代理测试类
 * @Description: 
 * @ClassName: TestProxy
 * @Project: base-info
 * @Author: zxf
 * @Date: 2011-5-19
 */
public class TestProxy {

	public static void main(String[] args) {
		//cjlib基于类的代理
		ServicesImpl serviceImp = (ServicesImpl) new CGlibProxyFactory().getProxy(ServicesImpl.class);
		serviceImp.outPut();

	}
}

intercept(Object obj, Method method, Object[] args,MethodProxy proxy)是CGLib定义的Inerceptor接口的方法,obj表示代理后的子类 ,method为父类方法的反射对象,args为方法的动态入参, 而proxy为代理类实例。一般使用 proxy进行调用父类方法,这样更快。

你可能感兴趣的:(cglib动态代理)