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

相关文章
|
13天前
|
缓存 负载均衡 安全
|
15天前
|
前端开发 Java 编译器
【前端学java】如何从前端视角快速学习Maven
【8月更文挑战第12天】如何从前端视角快速学习Maven
27 2
【前端学java】如何从前端视角快速学习Maven
|
2月前
|
缓存 Java 测试技术
day27:Java零基础 - 动态代理
【7月更文挑战第27天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
23 2
day27:Java零基础 - 动态代理
|
7天前
|
设计模式 Java C++
揭秘!JDK动态代理VS CGLIB:一场关于Java代理界的‘宫心计’,你站哪队?
【8月更文挑战第24天】Java 动态代理是一种设计模式,允许在不改动原类的基础上通过代理类扩展功能。主要实现方式包括 JDK 动态代理和 CGLIB。前者基于接口,利用反射机制在运行时创建代理类;后者采用继承方式并通过字节码技术生成子类实现类的代理。两者在实现机制、性能及适用场景上有明显差异。JDK 动态代理适用于有接口的场景,而 CGLIB 更适合代理未实现接口的类,尽管性能更优但存在一些限制。开发者可根据需求选择合适的代理方式。
30 0
|
29天前
|
存储 算法 Java
Java零基础(1) - 从零开始学习数组
【8月更文挑战第1天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
28 1
|
2月前
|
数据采集 安全 Java
Java Selenium WebDriver:代理设置与图像捕获
Java Selenium WebDriver:代理设置与图像捕获
|
2月前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
20 3
|
2月前
|
设计模式 Java
Java进阶之代理
【7月更文挑战第16天】Java动态代理通过`java.lang.reflect.Proxy`和`InvocationHandler`实现,无需编译期定义代理类。与静态代理相比,它更灵活,代码更简洁,适用于方法数量变化或未知接口代理。
18 2
|
23天前
|
Java 测试技术 开发者
Java零基础教学(07):学习正确的命名规范
【8月更文挑战第7天】Java零基础教学篇,手把手实践教学!
58 0
|
2月前
|
Java 数据库 Spring
Java编程问题之在测试中使用CGLIB创建代理类如何解决
Java编程问题之在测试中使用CGLIB创建代理类如何解决
下一篇
云函数