代理模式(一)

代理模式是指为其他对象提供一种代理,一控制对这个对象的访问
在客服端和目标对象之间气到中介作用

静态代理

硬编码

动态代理

通过生成字节码,重新组成一个新的类

动态代理demo

guoqiang给liqi找小姑娘

public class Liqi implements Iperson {
    public void findLove() {
        System.out.println("找小姑娘");
    }
}
public class Guoqiang implements InvocationHandler {

    private Object liqi;
    public Object getInstance(Object target){
        this.liqi = target;
        Class<?> clazz = target.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("打车找地方去");
        method.invoke(liqi,args);
        System.out.println("事后付钱");
        return null;
    }
}
public class Test {

    public static void main(String[] args) throws Throwable {
        dynamicproxy.Guoqiang guoqiang = new dynamicproxy.Guoqiang();
        Iperson instance = (Iperson)guoqiang.getInstance(new Liqi());
        instance.findLove();
    }

}

jdk

实现invacationHandler接口;需要拿到被代理类的接口,一定要有接口;调用更复杂
生成逻辑简单,效率低,用反射

cglib

实现methodIntercepter接口
不需要用户持有接口等前置条件;直接继承拿到被代理类的class重写
效率更高,没用反射;目标代理类没有final修饰方法‘

优缺点

代理对象和真实调用的目标对象分离,解耦
增加类复杂度,请求速度变慢

spring判断bean有接口实现时,用jdk,没有则用cglib;默认用jdk代理,可以更改配置使用cglib;
[图片上传失败...(image-34dec5-1583072484300)]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。