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天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
2天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
2天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
2天前
|
Java API
Java从入门到精通:2.1.5深入学习Java核心技术之文件操作
Java从入门到精通:2.1.5深入学习Java核心技术之文件操作
|
2天前
|
并行计算 算法 安全
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
|
3天前
|
设计模式 Java 索引
由反射引出的Java动态代理与静态代理
由反射引出的Java动态代理与静态代理
12 0
|
7天前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
23 11
|
7天前
|
JavaScript Java 测试技术
基于Java的驾考自主学习预约平台的设计与实现(源码+lw+部署文档+讲解等)
基于Java的驾考自主学习预约平台的设计与实现(源码+lw+部署文档+讲解等)
21 0
|
8天前
|
监控 Java 开发者
掌握 Java 反射和动态代理
【4月更文挑战第19天】Java反射和动态代理提供强大功能和灵活性。反射允许运行时检查和操作类,获取类信息、动态调用方法,但可能带来性能损失和降低代码可读性。动态代理则用于创建代理对象,实现透明性和横切关注点分离,常用于日志、权限检查等。两者结合能实现更复杂功能。掌握这些技术能提升代码的灵活性和可扩展性,但也需注意性能和可读性。通过学习和实践,能更好地构建高效软件系统。