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;
}
}