美文网首页程序员
MyBatis多级代理编程实现

MyBatis多级代理编程实现

作者: GGarrett | 来源:发表于2018-11-24 00:07 被阅读7次

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();   
    }
}

测试结果

蝉吃树叶
螳螂吃蝉
黄雀吃螳螂

相关文章

网友评论

    本文标题:MyBatis多级代理编程实现

    本文链接:https://www.haomeiwen.com/subject/yegsqqtx.html