Java动态代理学习1——静态代理

一、代理模式

代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。

代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

按照代理的创建时期,代理类可以分为两种:

静态代理:由程序员创建或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。动态代理:在程序运行时运用反射机制动态创建而成。

二、单个静态代理

    publicinterfaceCountDao { //查看账户方法 publicvoidqueryCount(); } publicclassCountDaoImplimplementsCountDao { publicvoidqueryCount() { System.out.println("查看账户方法..."); } } publicclassCountTrancProxyimplementsCountDao { privateCountDaocountDao; publicCountProxy(CountDaocountDao) { this.countDao=countDao; } @OverridepublicvoidqueryCount() { System.out.println("trancstart"); countDao.queryCount(); System.out.println("trancend"); } } publicclassTestCount { publicstaticvoidmain(String[]args) { CountTrancProxycountProxy=newCountTrancProxy(newCountDaoImpl()); countProxy.updateCount(); } }

tranc start查看账户方法…tranc end

三、多个静态代理

在上面代码的基础上新增了

    publicclassCountLogProxyimplementsCountDao { privateCountDaocountDao; publicCountLogProxy(CountDaocountDao) { this.countDao=countDao; } @OverridepublicvoidqueryCount() { System.out.println("Logstart"); countDao.queryCount(); System.out.println("Logend"); } }

调用代码就变成了

    //体现了聚合的思想,代理之间的组合 publicstaticvoidmain(String[]args) { CountTrancProxytrancProxy=newCountTrancProxy(newCountDaoImpl()); CountLogProxylogPro=newCountLogProxy(trancProxy); logPro.queryCount(); }

Log start事务处理之前查看账户方法…事务处理之后Log end

四、总结

其实可以用代理类可以用继承或实现接口两种方式达到代理的效果,但是当多个代理类需要相互组合的时候,继承就不灵活了,需要不断重写代理类,而实现接口的方式就十分容易通过的聚合实现代理类之间的组合。

IT徐胖子的专栏” 博客,请务必保留此出处http://woshixy.blog.51cto.com/5637578/1066829

痛苦留给的一切,请细加回味!苦难一经过去,苦难就变为甘美。

Java动态代理学习1——静态代理

相关文章:

你感兴趣的文章:

标签云: