• 技术文章 >Java >java教程

    java 静态代理 动态代理深入学习

    黄舟黄舟2016-12-12 13:24:50原创932
    一、代理模式
    代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
    代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
    按照代理的创建时期,代理类可以分为两种:
    静态代理:由程序员创建或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
    动态代理:在程序运行时运用反射机制动态创建而成。

    二、单个静态代理

    码如下:
    public interface CountDao 
    { 
    // 查看账户方法 
    public void queryCount(); 
    } 
    public class CountDaoImpl implements CountDao 
    { 
    public void queryCount() 
    { 
    System.out.println("查看账户方法..."); 
    } 
    } 
    public class CountTrancProxy implements CountDao 
    { 
    private CountDao countDao; 
    public CountProxy(CountDao countDao) 
    { 
    this.countDao = countDao; 
    } 
    @Override 
    public void queryCount() 
    { 
    System.out.println("tranc start"); 
    countDao.queryCount(); 
    System.out.println("tranc end"); 
    } 
    } 
    public class TestCount 
    { 
    public static void main(String[] args) 
    { 
    CountTrancProxy countProxy = new CountTrancProxy(new CountDaoImpl()); 
    countProxy.updateCount(); 
    } 
    }

    tranc start
    查看账户方法...
    tranc end
    三、多个静态代理
    在上面代码的基础上新增了

    码如下:
    public class CountLogProxy implements CountDao 
    { 
    private CountDao countDao; 
    public CountLogProxy(CountDao countDao) 
    { 
    this.countDao = countDao; 
    } 
    @Override 
    public void queryCount() 
    { 
    System.out.println("Log start"); 
    countDao.queryCount(); 
    System.out.println("Log end"); 
    } 
    }

    Log start
    事务处理之前
    查看账户方法...
    事务处理之后
    Log end
    四、总结
    其实可以用代理类可以用继承或实现接口两种方式达到代理的效果,但是当多个代理类需要相互组合的时候,继承就不灵活了,需要不断重写代理类,而实现接口的方式就十分容易通过的聚合实现代理类之间的组合。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:java静动态的代理
    上一篇:java写入文件的几种方法 下一篇:Java开发中的23种设计模式详解
    千万级数据并发解决方案

    相关文章推荐

    • 带你搞懂Java结构化数据处理开源库SPL• 一文搞懂Java接口• 一起来理解Java中的泛型• 整理分享Java语言表达式的五个谜题• 详细整理java枚举的使用总结
    1/1

    PHP中文网