Java动态代理

Spring AOP是通过动态代理实现的,而动态代理有两种实现方式,一种是JDK动态代理实现,另一种是通过Cglib来实现动态代理。JDK动态代理实现有它自身的缺陷, 它的代理类必须实现一个接口

1. JDK动态代理主要用到的类:
InvocationHandler接口: 代理实例的调用处理程序实现的接口。
Proxy:供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。

package com.kevin.learning;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class UserProxy implements InvocationHandler {
	
	private Object target;
	
	/**
	 * 绑定委托对象并返回一个代理类
	 * @return
	 */
	public Object bind(Object target) {
		this.target = target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}
	
	

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("begin add user.");
		Object result = method.invoke(target, args);
		System.out.println("end add user.");
		return result;
	}

}



2.Cglib实例:
MethodInterceptor接口中的intercept方法
package com.kevin.learning;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class UserCglib implements MethodInterceptor {
	private Object target;
	
	public Object getInstance(Object target) {
		this.target = target;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		// 回调方法
		enhancer.setCallback(this);
		// 创建代理对象
		return enhancer.create();
	}

	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		System.out.println("--------cglib begins.--------");
		proxy.invokeSuper(obj, args);
		System.out.println("--------cglib ends.----------");
		return null;
	}

	
}

你可能感兴趣的:(java)