- 代理是一种软件设计模式,目的地希望能做到代码重用
- 通过不直接访问被代理对象的方式,访问被代理对象的方法.eg:商户---->明星经纪人(代理)---->明星。通过明星经纪人访问明星
使用场景
- 之前的代码很难修改,但是需要扩展方法
- Spring的AOP机制
静态代理
- 代码编译时就确定了被代理的类是哪一个,那么就可以直接使用静态代理
- 对于静态代理,代理类要实现和被代理类相同的接口
- 说简单点:静态代理就是代理类中引入了被代理类的对象,通过静态代理访问被代理类,增强被代理类的某些方法
动态代理
- 代码运行期间加载被代理的类这就是动态代理,比如RPC框架和Spring AOP机制
- 被代理的类需要实现一个接口
- 不直接访问某些对象的情况下,通过代理机制也可以访问被代理对象的方法
- jdk的代理机制必须要求被代理类实现某个接口,这样生成的代理类才能知道重写哪些方法
- 委托类:InvocationHandler。通过代理类调用方法的时候最终都会调用里面的invoke()
public class DynamicProxy implements InvocationHandler {
private Object obj;
public DynamicProxy(Object obj){
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke method");
return method.invoke(this.obj,args);
}
public static Object getInstance(Object student){
ClassLoader classLoader=student.getClass().getClassLoader();
Class<?>[] interfaces=student.getClass().getInterfaces();
//此处interfaces必须是接口,如果是实体类会报错
Object proxy = Proxy.newProxyInstance(classLoader, interfaces, new DynamicProxy(student));
return proxy;
}
}
- 动态代理的步骤:
- 实现 InvocationHandler 接口产生一个方法委托类(调用代理类中的方法时便会调用委托方法)
- 使用 Proxy 来产生代理类
概览:https://blog.youkuaiyun.com/u011784767/article/details/78281384
内部原理(自己写一个proxy):https://www.cnblogs.com/lfdingye/p/7717063.html
静态代理和动态代理
- 相比于动态代理,静态代理想要代理一个接口,就必须新写一个该接口的实现类。如果接口中增加一个方法,则所有的代理都得去实现这个方法
- 动态代理很好的解决了上面的两个问题,所有的接口都可以使用同一个代理类;即使接口方法发生变化,也不会影响