代理模式

意图
  1. 安全原因. 屏蔽真是对象
  2. 延迟加载
代码
  1. 定义一个接口
public interface IDBQuery {
    
    String request();
    
}
  1. 真正实现类
public class DBQuery implements IDBQuery{

    public DBQuery(){
        try{
            Thread.sleep(1000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
    
    public String request() {
        System.out.println("request string");
        return "request string";
    }

}
  1. 代理类, 创建速度快, 用于代替DBQuery的位置
public class DBQueryProxy implements IDBQuery{

    private DBQuery real = null;
    
    public String request() {
        if(real == null)
            real = new DBQuery();
        return real.request();
    }

}
  1. 主函数. 用代理类替代真实类创建IDBQuery, 当真正调用时在初始化真实对象
public class Main {
    
    public static void main(String[] args) {
        IDBQuery q = new DBQueryProxy();
    
        q.request();
    }
    
}
动态代理
动态代理是指在运行时, 动态生成代理类. 即, 代理类的字节码将在运行时生成并载入当前的ClassLoader.

动态代理的加载过程:

  1. 根据指定的回调类生成Class字节码
  2. 通过ReflectUtils.defineClass()调用ClassLoader.defineClass(),将字节码装载到ClassLoader中
  3. 使用ReflectUtils.newInstance() 反射机制生成该类的实例
代码
  1. 使用JDK自带的动态代理
public class JdkDbQueryHandle implements InvocationHandler{

    IDBQuery real = null;
    
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        
        if(real == null)
            real = new DBQuery();
        
        return real.request();
    }

    public IDBQuery createJdkProxy(){
        IDBQuery jdkProxy = (IDBQuery)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{ IDBQuery.class},new JdkDbQueryHandle());
        return jdkProxy;
    }
    
}
  1. 使用CGLib动态代理
public class CglibDbQueryInterceptor implements MethodInterceptor{

    IDBQuery real = null;
    
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        if(real == null)
            real = new DBQuery();
        
        return real.request();
    }
    //创建代理类
    public IDBQuery createCglibProxy(){
        Enhancer enhancer = new Enhancer();
        enhancer.setCallback(new CglibDbQueryInterceptor());
        enhancer.setInterfaces(new Class[]{ IDBQuery.class});
        IDBQuery cglibProxy = (IDBQuery)enhancer.create();
        
        return cglibProxy;
    }
    
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容

  • 一、概述   代理模式我们接触的就比较多了,所谓的代理模式就是,给某一个对象提供一个代理对象,并由代理对象控制对原...
    骑着乌龟去看海阅读 909评论 0 9
  • 什么是代理模式 代理模式是对象的结构模式。代理模式为其他对象提供一种代理以控制对这个对象的访问。简单来说,在某些情...
    walidake阅读 3,218评论 4 27
  • 代理模式 定义 为实际对象提供一个代理,以控制对实际对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,...
    CoderBao阅读 1,222评论 0 0
  • 200 这几天忙得脚不沾地,仿佛各种各样的事情席卷而来,要把我埋起来一样。特别是昨天,从早上六点多到晚上九...
    南街曹淑慧阅读 303评论 0 0
  • 第十六回 争歧(上) 这一夜稍晚的时候,梅长苏和黎刚赶回了苏宅。一进门,就看到上上下下严阵以待的样子,梅长苏不由得...
    鱼_lfinit阅读 2,963评论 0 15