MyBatis|多级代理编程实现


Mybatis代理设计模式(Proxy)与编程实现原理
下面接着上篇文章写继续写多级代理

1. 实例讲解

a. 实例介绍
  • 实现一个多级代理,螳螂捕蝉,黄雀在后。
  • 蝉吃树叶,螳螂吃蝉,黄雀吃螳螂。
b. 具体实现

步骤1:创建一个接口对象(BaseService),声明真实对象(蝉),蝉的行为被监听,需要被代理对象1(螳螂)吃掉,螳螂的主要任务也是吃,行为被监听,被代理对象2(黄雀)吃掉。

public interface BaseService {

    //吃是主要业务,也是被监听行为
    public void eat();
}

步骤2:创建真实对象(蝉)

public class 蝉 implements BaseService {

    @Override
    public void eat() {
        System.out.println("蝉吃树叶");
    }

}

步骤3:创建代理对象1(螳螂) 也是被行为监听对象。

public class 螳螂 implements InvocationHandler {

    private BaseService obj;//小蝉  真实对象
    
    //invoke方法就是螳螂类的主要业务方法,也是需要被监听方法
    @Override
    public Object invoke(Object listener, Method method, Object[] args) throws Throwable {
        //蝉吃树叶
        method.invoke(obj, args);
        次要业务();
        return null;
    }
    //完成主要业务和次要业务绑定
    public 螳螂(BaseService param) {
        this.obj = param;
    }

    private void 次要业务(){
        System.out.println("螳螂吃蝉");
    }

}

步骤4:创建代理工厂(BeanFactory),对所有吃的行为有一个监听。

public class BeanFactory {

    public static BaseService newInstance(Class classFile){
        
            //1.创建一个真实的小蝉
            BaseService    真实小蝉 =  new 蝉();
            //2.创建代理实现类对象  螳螂
            InvocationHandler 螳螂 = new 螳螂(真实小蝉);
            
            //3.向JVM所要代理对象(监听对象) 监听蝉何时吃树叶,通知螳螂
            Class array[]={BaseService.class};
           BaseService proxy1=  (BaseService) Proxy.newProxyInstance(classFile.getClassLoader(), array, 螳螂);
    
    }
}

步骤5:上面几个步骤基本上一级代理已经实现,下面主要思考螳螂的主要业务是什么?

public class 黄雀 implements InvocationHandler {

    private Object proxy1;//监听小婵的监听对象
      
    public 黄雀(Object proxy1) {
        this.proxy1 = proxy1;
    }
    //method就是螳螂的主要方法
    @Override                         
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        
           //主要业务 螳螂军吃蝉,让一级代理对象通知螳螂,蝉吃树叶
           method.invoke(proxy1, args);
           次要业务();
           return null;
    }
    
    private  void 次要业务(){
        System.out.println("黄雀吃螳螂");
    }

}

步骤6:在BeanFactory中的newInstance方法添加代理实现类(黄雀)

public class BeanFactory {
          .........................省略前面代码
           //4.创建代理实现类  黄雀
           InvocationHandler 黄雀 = new 黄雀(proxy1);
           BaseService proxy2 =(BaseService) Proxy.newProxyInstance(classFile.getClassLoader(), array, 黄雀);
           return proxy2;
    }
}

步骤7:添加测试类

public class TestMain {

    public static void main(String[] args) {    
        BaseService 小蝉 = BeanFactory.newInstance(蝉.class);
        小蝉.eat();   
    }
}

测试结果

蝉吃树叶
螳螂吃蝉
黄雀吃螳螂
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • 看熊猫要去四川?NO,厦门灵玲马戏就有了呀! 长颈鹿,河马,树懒,小浣熊,鹦鹉,猩猩,羊驼,鸸鹋……各种各样的的动...
    小娴_阅读 5,958评论 0 0
  • 公司:38磁疗饰品--林艳--378期反省一组塾生【日精进打卡第16天】 【经典诵读】 《六项精进》大纲诵读1遍,...
    林艳的阅读 1,310评论 0 0
  • 之前我觉得我是安生,你是七月。 后来发现你才是安生,而我早已不知觉中成了七月。 那些我不在的日子里,我以为你像七月...
    赵哈哈_阅读 2,444评论 0 0
  • 各位战友,大家下午好,我是来自河南周口的***,很高兴能够有机会和大家相识在这里。 大家听到周口,第一反应可能就是...
    反思的木偶人阅读 4,449评论 0 1

友情链接更多精彩内容