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

简介:

一、代理模式


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

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

 

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

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

 

 

二、单个静态代理

 

 
  1. public interface CountDao  
  2. {  
  3.     // 查看账户方法  
  4.     public void queryCount();  
  5. }  
  6.  
  7. public class CountDaoImpl implements CountDao  
  8. {  
  9.     public void queryCount()  
  10.     {  
  11.         System.out.println("查看账户方法...");  
  12.     }  
  13. }  
  14.  
  15. public class CountTrancProxy implements CountDao  
  16. {  
  17.     private CountDao countDao;  
  18.  
  19.     public CountProxy(CountDao countDao)  
  20.     {  
  21.         this.countDao = countDao;  
  22.     }  
  23.  
  24.     @Override 
  25.     public void queryCount()  
  26.     {  
  27.         System.out.println("tranc start");  
  28.         countDao.queryCount();  
  29.         System.out.println("tranc end");  
  30.     }  
  31. }  
  32.  
  33. public class TestCount  
  34. {  
  35.     public static void main(String[] args)  
  36.     {  
  37.         CountTrancProxy countProxy = new CountTrancProxy(new CountDaoImpl());  
  38.         countProxy.updateCount();  
  39.     }  

tranc start
查看账户方法...
tranc end

 

三、多个静态代理

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

 

 
  1. public class CountLogProxy implements CountDao  
  2. {  
  3.     private CountDao countDao;  
  4.  
  5.     public CountLogProxy(CountDao countDao)  
  6.     {  
  7.         this.countDao = countDao;  
  8.     }  
  9.  
  10.     @Override 
  11.     public void queryCount()  
  12.     {  
  13.         System.out.println("Log start");  
  14.         countDao.queryCount();  
  15.         System.out.println("Log end");  
  16.     }  

调用代码就变成了

 

 
  1. //  体现了聚合的思想,代理之间的组合  
  2. public static void main(String[] args)  
  3. {  
  4.     CountTrancProxy trancProxy = new CountTrancProxy(new CountDaoImpl());  
  5.     CountLogProxy logPro = new CountLogProxy(trancProxy);  
  6.     logPro.queryCount();  

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

 

四、总结

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

本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1066829如需转载请自行联系原作者


woshixuye111

相关文章
|
5天前
|
消息中间件 前端开发 Java
java学习路径
【4月更文挑战第9天】java学习路径
14 1
|
25天前
|
安全 Java 程序员
学习Java类加载机制
在Java的世界里,每一个类或者接口,在经历编译器后,都会生成一个个.class文件。
16 0
|
5天前
|
设计模式 前端开发 安全
Java是一种广泛使用的编程语言,其学习路径可以大致分为以下几个阶段
【4月更文挑战第9天】Java是一种广泛使用的编程语言,其学习路径可以大致分为以下几个阶段
10 1
|
2天前
|
Java 存储
键值之道:深入学习Java中强大的HashMap(二)
键值之道:深入学习Java中强大的HashMap
8 0
键值之道:深入学习Java中强大的HashMap(二)
|
4天前
|
JavaScript Java 测试技术
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
9 0
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
|
23天前
|
前端开发 Java 数据库连接
五年Java学习心路历程
五年Java学习心路历程
32 0
|
30天前
|
Java 程序员 数据安全/隐私保护
Java中的异常语法知识居然这么好玩!后悔没有早点学习
Java中的异常语法知识居然这么好玩!后悔没有早点学习
32 1
|
30天前
|
分布式计算 Oracle Java
第一篇CSDN博客——Java入门指南:学习Java编程的第一步
第一篇CSDN博客——Java入门指南:学习Java编程的第一步
|
30天前
|
Java API 开发者
Java代理模式——静态代理与动态代理
Java代理模式——静态代理与动态代理
25 1
|
Java
domino中lotusscprit调用java代理
 Dim sess As New NotesSession Dim db As NotesDatabase Dim agent As NotesAgent Dim doc As NotesDocument  Set db = sess.
880 0