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

简介:

 

一、代理模式


代理模式是常用的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

 

 

四、总结

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

 

 

目录
相关文章
ECS新旧实例数据及网络无缝迁移实操
一、背景 之前由于因为有业务变迁不得不更换实例,但是数据和网络需要做到同步,面对这样的需求,我们也是绞尽脑汁,仔细专研了阿里云的产品文档,最后解决了这个问题,这边整理一下实际操作过程,把踩过的坑记录一下。
3660 0
|
移动开发 小程序 IDE
在家办公期间,如何多团队协作开发 App
应对疫情防控,如何确保现有业务不受或减少影响将成为大多数企业需面对的核心课题。线下业务的快速转型,从而实现线上化输出;线上业务如何持续迭代,形成有效率的敏捷开发流——线上线下的无缝联动,将成为大部分企业下一步演进变革的方向。
2191 0
在家办公期间,如何多团队协作开发 App
|
城市大脑 芯片 异构计算
阿里AI芯片含光800已大规模应用,服务城市大脑、拍立淘
在2019杭州云栖大会首日,阿里巴巴平头哥发布首颗芯片含光800,该芯片性能和能效比均为全球第一,目前已大规模应用阿里巴巴集团内部城市大脑、拍立淘等业务,与此同时,基于含光800的AI云服务也正式上线,相比传统GPU算力,性价比提升100%。
2769 0
|
移动开发
阿里小程序云应用开发指南
小程序云应用是面向小程序应用场景,为开发者提供的一键构建后端应用运行环境、后端服务部署、运维监控等能力的一站式小程序部署服务。 小程序云应用是小程序云的一个重要组成部分。小程序云是阿里云面向小程序场景提供的一站式云服务,帮助开发者实现一云多端的业务战略。
8144 0
|
Shell 测试技术 块存储
Ceph分布式存储系统-性能测试与优化
# 测试环境 部署方案:整个Ceph Cluster使用4台ECS,均在同一VPC中,结构如图: 以下是 Ceph 的测试环境,说明如下: - Ceph 采用 10.2.10 版本,安装于 CentOS 7.4 版本中;系统为初始安装,没有调优。
13993 0
|
弹性计算 关系型数据库 数据库
阿里云配置审计 - 规则篇
阿里云配置审计提供了持续的合规审计功能,以审计规则作为落地合规审计的具体策略,基于自动化的手段帮助企业用户完善资源合规审计制度,确保“等级2.0”具体实施的快速落地。它一方面提供了丰富的托管审计规则,提供基础的合规审计功能,开箱即用,可以满足绝大部分用户需求;另外用户可以开发自定义的审计规则,完善内部最佳实践和指南。
5945 0
|
关系型数据库 应用服务中间件 数据库
【阿里云新品发布·周刊】第18期:应用高可用服务 AHAS 商业化首发,一步提升应用可用性
点击订阅新品发布会! 新产品、新版本、新技术、新功能、价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布 应用高可用服务 AHAS 商业化首发 2019年7月17日15时,应用高可用服务 AHAS 商业化首发。
2440 0
|
存储 弹性计算 JavaScript
【ECS最佳实践】使用多块云硬盘构建RAID组
1.RAID简介 RAID是将多个独立的磁盘按照一定的方式组成1个磁盘阵列组,相比单个磁盘能够有效的提高磁盘的容量、带宽以及可靠性和可用性。 说明: 1.不建议对云盘采用RAID5 和RAID6模式,这些RAID模式的奇偶校验数据会占用一定的IOPS,从而造成性能的损失 2.建议创建RAID0,RAID1模式,并使用相同分区大小,以减少云盘空间的浪费 如下是常见的RAID配置选项: 配置 优点 劣势 使用场景 RAID0 I/O在卷内以条带化的方式分布在各个磁盘上。
|
对象存储 JavaScript
省钱秘笈☞将静态网站迁移至阿里云OSS(教你如何利用OSS低成本建站)
前言: 新用户领取阿里云最新的代金券,再结合OSS建站,几乎是零成本哦!不经意间发现阿里云居然有送半年得活动,还可以在线领取1888元代金券!(活动地址:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=9u2gonnn)  所需:  1、开通阿里云OSS并创建Bucket 2、购买域名并通过备案 步骤:  1、在“Bucket属性”中的“静态网站”页面,直接写一个默认首页的文件名就可以了。
4125 0