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

相关文章
|
2月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
95 43
Java学习十六—掌握注解:让编程更简单
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
20天前
|
Java
JAVA 静态代理 & 动态代理
【11月更文挑战第14天】静态代理是一种简单的代理模式实现,其中代理类和被代理类的关系在编译时已确定。代理类实现与被代理类相同的接口,并持有被代理类的实例,通过调用其方法实现功能增强。优点包括代码结构清晰,易于理解和实现;缺点是对于多个被代理类,需为每个类编写相应的代理类,导致代码量大增,维护成本高。动态代理则在运行时动态生成代理类,更加灵活,减少了代码冗余,但可能引入性能损耗和兼容性问题。
|
2月前
|
设计模式 Java API
[Java]静态代理与动态代理(基于JDK1.8)
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
30 0
[Java]静态代理与动态代理(基于JDK1.8)
|
2月前
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
37 2
|
2月前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
2月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
36 0
|
7月前
|
存储 安全 Java
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
91 1
|
7月前
|
存储 Java
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法