2.动态代理
JDK的动态代理首先看InvocationHandler接口
public interface InvocationHandler
extends Callback
{
public abstract Objectinvoke(Object obj, Methodmethod, Object aobj[])
throws Throwable;
}
这个接口只有一个invoke方法
第一个参数是代理的真实的对象
第二个参数是调用真实对象的方法
第三个是调用方法需要的参数
再看下Proxy类,用的最多的是里面的newProxyInstance方法
public class Proxy
implements Serializable
{
public static Object newProxyInstance(ClassLoader loader, Class interfaces[], InvocationHandler h)
{
Class clazz = getProxyClass(loader,interfaces);
return clazz.getConstructor(new Class[] {
org.springframework.cglib.proxy.InvocationHandler.class
}).newInstance(new Object[] {
h
});
RuntimeException e;
e;
throw e;
e;
throw newCodeGenerationException(e);
}
}
这个方法的第一个参数是一个ClassLoader对象,定义了由哪个ClassLoader对象来生成代理对象进行加载
第二个参数是一个interfaces的数组,表示我将要给我代理的对象提供什么接口,这样生成代理的对象的时候就可以调用这些接口里面的方法
第三个参数是一个InvocationHandler对象,表示这个动态代理对象调用方法的时候会关联到哪个invocationHandler对象
在整个动态代理模式中,每一个代理类都要实现InvocationHandler接口,每一个代理类对象都是一个InvocationHandler对象
这个代理类提供了一个构造方法,参数是Object 类,代表这个代理类对象生成时真正代理的对象
在代理类里面会执行Method对象的invoke方法执行真实对象的方法
而在客户端我们会先通过这个代理类得到InvocationHandler对象
然后通过Proxy类的newProxyInstance方法去得到这个真实的对象,然后调用
整个的流程应该是
说到动态代理,就不得不提到spring的Aop的实现
Aop的动态代理实现需要四个角色,被代理的类,被代理的接口,织入器,和切面
Proxy.newProxyInstance就是织入器,InvocationHandler是切面,首先织入器利用接口反射机制生成代理类,然后在这个代理类中织入方法,织入的是切面的方法,spring中默认的是动态代理机制试下Aop,因为动态代理机制下代理类必须要实现接口,如果代理类没有实现接口,则采用CGlib机制实现Aop,CGlib机制后续再进行补充