开发者社区> 徐胖子> 正文

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

简介:   一、代理模式 代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。    按照代理的创建时期,代理类可以分为两
+关注继续查看

 

一、代理模式


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

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

 

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

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

 

 

二、单个静态代理

 

public interface CountDao
{
	// 查看账户方法
	public void queryCount();
}

public class CountDaoImpl implements CountDao
{
	public void queryCount()
	{
		System.out.println("查看账户方法...");
	}
}

public class CountTrancProxy implements CountDao
{
	private CountDao countDao;

	public CountProxy(CountDao countDao)
	{
		this.countDao = countDao;
	}

	@Override
	public void queryCount()
	{
		System.out.println("tranc start");
		countDao.queryCount();
		System.out.println("tranc end");
	}
}

public class TestCount
{
	public static void main(String[] args)
	{
		CountTrancProxy countProxy = new CountTrancProxy(new CountDaoImpl());
		countProxy.updateCount();
	}
}


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

 

 

三、多个静态代理

 

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

public class CountLogProxy implements CountDao
{
	private CountDao countDao;

	public CountLogProxy(CountDao countDao)
	{
		this.countDao = countDao;
	}

	@Override
	public void queryCount()
	{
		System.out.println("Log start");
		countDao.queryCount();
		System.out.println("Log end");
	}
}

调用代码就变成了

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

 

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

 

 

四、总结

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

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
spring源码学习【准备】之jdk动态代理和cglib动态代理的区别和性能
一:区别:---->JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。--->JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
946 0
【2018杭州云栖】机器学习专场:为AI的旅程加速
被互联网从业者称为“朝圣大会”的云栖大会,于2018年9月19日至22日在美丽的杭州云栖小镇举办。今年会议的主题是“驱动数字中国”,来自全球6个大洲81个国家及地区共12万人次现场参加。
1517 0
spring源码学习之【准备】cglib动态代理例子
一:委托者 1 package com.yeepay.porxy.cglib.test; 2 3 import java.util.HashMap; 4 import java.
863 0
ITAA:网络模拟平台+学习资料+学习视频=7.5G(Bit下载)
http://www.gotolab.cn/2008/06/22/itaa-open-vmware/
482 0
自己在linux上编译、链接、动态库和静态库的学习笔记
在平常的项目中,我们都是使用公司要求的makefile、makedebug一类的文件,因此,在编译、链接、生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改、添加一些文件名,或许这次我们编译通过了,但是,在某一个时候,可能出现了一个问题,无论简单与否,因为平常没有留意,导致的结果可能是花了好长时间才能解决。
918 0
IDA反汇编/反编译静态分析iOS模拟器程序(二)加载文件与保存数据库
启动windows版的IDA,在Quickstart界面点击New,弹出一个对话框选择文件。也可以按取消后再把文件拖进IDA。由于Mac版的IDA没注册,没有save功能,所以只好先把Mac上的东西拷贝到windows再打开了。
1112 0
+关注
515
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载