Emit学习-实战篇-实现一个简单的AOP框架(一)

周末两天窝在家里,使用Emit做了一个非常简单的AOP框架,当做是这几周学习Emit后的一个实践。东西出来了,自然要和大家分享一下,虽然框架做的比较粗糙、简单,但是也已经能够看到一点AOP的雏形了,用来自己无聊玩玩还是可以的,当然要用到产品中去肯定还需要长期的完善啦。

说起AOP相信园子里很多高手都研究过,园子里好像也有自己的开源AOP项目,不过我时间有限没有细找,同时也发现园子研究AOP理论方面的文章很多,但是好像并没有完整的实现一个简单AOP框架的例子(当然我只是简单的找了一下,如有遗漏恳请谅解。),正好趁这个机会写一个这方面的例子,能够让像我这样的菜鸟对AOP有更多的了解。

有关AOP的概念介绍,网上有非常多的解释,我也没有时间一一细看,这里给出百度百科中的解释:

面向方面编程:Aspect Oriented Programming

AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。

举例:假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。

为了完成上述并发访问同一资源的功能,需要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就立即解锁unLocked,再供其它访问类访问。

使用传统的编程习惯,我们会创建一个抽象类,所有的访问类继承这个抽象父类,如下:

abstract class Worker{

         abstract void locked();

         abstract void accessDataObject();

         abstract void unlocked();

   }

缺点:

accessDataObject()方法需要有“锁”状态之类的相关代码。

Java只提供了单继承,因此具体访问类只能继承这个父类,如果具体访问类还要继承其它父类,比如另外一个如Worker的父类,将无法方便实现。

重用被打折扣,具体访问类因为也包含“锁”状态之类的相关代码,只能被重用在相关有“锁”的场合,重用范围很窄。

仔细研究这个应用的“锁”,它其实有下列特性:

l “锁”功能不是具体访问类的首要或主要功能,访问类主要功能是访问数据对象,例如读取数据或更改动作。

l “锁”行为其实是和具体访问类的主要功能可以独立、区分开来的。

l “锁”功能其实是这个系统的一个纵向切面,涉及许多类、许多类的方法。如下图:

因此,一个新的程序结构应该是关注系统的纵向切面,例如这个应用的“锁”功能,这个新的程序结构就是aspect(方面)

在这个应用中,“锁”方面(aspect)应该有以下职责:

提供一些必备的功能,对被访问对象实现加锁或解锁功能。以保证所有在修改数据对象的操作之前能够调用lock()加锁,在它使用完成后,调用unlock()解锁。

时间: 2024-08-24 03:34:46

Emit学习-实战篇-实现一个简单的AOP框架(一)的相关文章

Emit学习-实战篇-实现一个简单的AOP框架(二)

已经9点了,就不废话了,直接开讲,今天就简单的介绍下框架中用到的一些接口和属性.昨天把我们关注的切面分成了三类,现在给出这3个接口的定义: 接口定义 /// <summary> /// 在调用方法体前执行的处理接口 /// </summary> public interface IPreProcess { bool PreProcess(MethodContext methodContext); } /// <summary> /// 在调用方法体后执行的处理接口 //

Emit学习-实战篇-实现一个简单的AOP框架(三)

今天来介绍配置文件的定义和加载,先给出配置文件的内容,然后在详细介绍里面各节的含义,以及如何用程序加载配置文件,内容如下: 配置文件 <?xml version="1.0" encoding="utf-8" ?> <AOP> <Regeisty> <IPreProcess> <Aspect id="AddPreProcessLog" value="YQL.TestProject:YQ

php实现的一个简单json rpc框架实例

 这篇文章主要介绍了php实现的一个简单json rpc框架实例,本文给出了RPC服务端和客户端代码以及应用实例,需要的朋友可以参考下     json rpc 是一种以json为消息格式的远程调用服务,它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列的实现.这种远程过程调用可以使用http作为传输协议,也可以使用其它传输协议,传输的内容是json消息体. 下面我们code一套基于php的rpc框架,此框架中包含rpc的服务端server,和应用端cl

快速构建一个简单的个人框架系列(2)--FastObject架构(改进)

架构也谈不上,就是一个简单的几个类. 目前FastObject功能还很小,尤其是多表查询和数据库兼容还存在一定的问题. 我们先把这两个问题搁这儿: 1.数据库某些地方的兼容 2.多表查询 为了这两个问题,我对先前的结构做了稍微的修改,后面慢慢就会感觉到. 人活一口气,树活一张皮.虽然上篇文章<快速构建一个简单的个人框架系列(1)--FastObject介绍> 贴出后,经过大家的指点,凸显出太大的不足,但是已经写出来了,就是只剩一口气我也要把它写完,写 不完我也要玩着写,在此感谢提建议的朋友们,

Windows 8 Store Apps学习(64) 后台任务: 开发一个简单的后台任务

介绍 重新想象 Windows 8 Store Apps 之 后台任务 开发一个简单的后台任务 示例 1.通过"Windows 运行时组件"新建一个后台任务 BackgroundTaskLib/Demo.cs /* * 后台任务 * * 注: * 后台任务项目的输出类型需要设置为"Windows 运行时组件",其会生成 .winmd 文件,winmd - Windows Metadata */ using System; using System.Threading

我的编程学习路-想做一个简单对对碰游戏,如何实现游戏界面啊?

问题描述 想做一个简单对对碰游戏,如何实现游戏界面啊? 我目前是大一的学生,编程方面的东西不是很懂,想做一个简单的对对碰游戏,可是运行结果总是不能出现游戏界面,请问我要怎么让那个界面出现呢,是否还要建立包含游戏图片的库??求大神们能和我说一下都需要做些什么 解决方案 做一个简单的游戏服务器 解决方案二: 不知到你的编程环境是什么,windows下可以考虑用MFC.他是windows API 的图形界面库,因该可以满足你的要求.

从零构建一个简单的 Python 框架

这篇文章旨在通过对设计和实现过程一步一步的阐述告诉读者,我在完成一个小型的服务器和框架之后学到了什么.你可以在这个代码仓库中找到这个项目的完整代码.我希望这篇文章可以鼓励更多的人来尝试,因为这确实很有趣.它让我知道了 web 应用是如何工作的,而且这比我想的要容易的多! 为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何工作的很感兴趣,因为你想要成

快速构建一个简单的个人框架系列(1)--FastObject介绍

哪个程序员没有一个梦?我的梦就是开发一个个人框架,轻量级,无需配置,功能强大但使用简单的 框架. 具体来说: (1).配置简单,简单,很简单.(不要xml映射) (2).轻量级, 很轻,很轻量.(学习成本一定要低) (3).操作方便,很方便,很方便.(写框架就是要方便) (4).数据库兼容,很兼容,很兼容.(至少要兼容Access和MSSQL) 岁月洗涤中,藉靠项目的经验,我终于痛定思痛写下了我的第一个Net2.0的框架--FastObject. 由于惯性和思维定势的影响,最后FastObjec

一个简单的PHP框架实现方法

  非原创,自己集合了类Apode+ DZ模板 + 封装PDO,应用过程就不用看了,和普通框架语法是一样的,看一下实现过程吧,主要学习如何去实现一个框架,等你学会扩展或在上面开发的话,学别的框架也只需要半小时了 几个核心 app.php __autoload(自动加载类) base.class.php abstract class Base {}//数据抽象 action.class.php abstract class Action extends Base {}//继承类 Action(核心