[干货][EMIT]千行代码实现代理式AOP+属性的自动装配

其实说起AOP,我在2011年的时候就发过一个帖子,CSDN的地址为http://bbs.csdn.net/topics/370067862,只是那时候对EMIT了解的深度不够,所以内容显得有些稚嫩,但对于我来说,意义很大。从那个时候开始起我算对EMIT入门了。

不扯远了,回到正题上来。AOP的实现方式是分2种的,一种是继承式的,这种实现的方式需要注入的方法上打上virtual,这样子类才能继承并重写它,如下图所示:

第二种就是代理式的,代理式的注入一般是需要有抽象的接口的,其大致的实现原理如下图所示:

而本文所使用的方式就是第二种,这里可能有的童鞋有疑问了,为啥呢?这里说明一下,在方法内部的EMIT代码的植入上其实没什么区别,只是第一种方式只需要重写带virtual的方法即可,在EMIT上而言,较为简单,并且在2011年的那个帖子的实现方式就是基于第一种,所以这次想换条路走走。而第二种是需要一个对接口实现的过程,难度稍微大一些,从学习的角度,自然也是最佳的选择。

说到这里只交代了正题的一半,那另一半是怎么回事呢?刚才已经把代理式的AOP的原理大致的说了一下,最终会动态的创建一个实现了某个接口的类,既然费劲的创建了一个新类,那肯定就是要使用它来做事情,做事情的第一步是什么呢?对拉,就是new一个实例。这时候懒人(例如我)就说了,这一个个的new多费劲,而且代码显得很low,想高大上?这时候你是不是想到了IOC或者DI呢(这俩名词不理解的童鞋可自行BAIDU),是的,可以。但一想到自己一个小小的项目要引一堆的dll,而且还用不到里面的几个方法,于是我创造轮子的想法又蹦出来了,当前这个不能跟各种IOC框架或者DI框架比,不是一个量级,也比不上人家完美,但对于我来说,就仅仅需要它自动装配即可,够用就好。于是在实现了AOP的基础上,自动装配的代码也开动了。。。

原理上我们大概了解了,剩下的就是动手了,而动手其实就是烧脑的过程,各种头疼的IL指令,为了不让各位童鞋也头疼或者看的费劲,这里面的过程我就不做详细的解释了,贴几个能展现部分逻辑的重要代码段:

最后我想通过一些测试的代码来展示一下这个东西的最终的效果,如果有想研究EMIT的童鞋,可根据我代码里面的注释,以及各种IL指令去理解和尝试一下自己创造一个轮子。

测试代码中测试了AOP的三种拦截方式:

1、一般拦截,在方法执行的前后,各执行一段代码

2、认证拦截,只有通过了认证接口后,才能正常的调用代理类的方法

3、异常拦截,在出现异常时,进行异常的捕获与处理

对测试类打的标记如下图所示:

写的测试例子:

运行的结果:

写到这里也就结束了,由于文采有限,只是把我想说的重点,表述了一下,大部分的内容都是贴图,可能有部分的童鞋看的不习惯,还请轻喷,谢谢。

关于版权,由于我的知识来自互联网,可以说,没有互联网,就没有现在的我,甚至就没我现在的饭碗,本着感恩的心,诚挚的回馈。所以我这里的代码是完全公开的,不涉及版权,您可以随便用(如果您对本源码有改造或者扩展,而且您愿意与大家一起分享的话,我将不胜感激),但因此而产生的各种后果也请您自行承担。如果您要转载本文,还请您保留原文的地址,谢谢。

源码地址:http://download.csdn.net/detail/nqicecoffee/9592036

时间: 2024-10-02 00:55:32

[干货][EMIT]千行代码实现代理式AOP+属性的自动装配的相关文章

一千行代码是什么感觉?

昨天过纪念日,今天做了数个小时的首页,越发觉得自己真是年轻的不得了. 还有,我恨天猫. 我真是佩服那些一天写五千行代码的程序猿们啊-- 一千行代码我就快要崩溃了,并且还不够一千行,我感觉sublime自己都要卡死了有木有! 不说了,今天没有心得,没有体会. 听说明天正式进行PHP的学习? 我很期待.

收藏-千行代码入门Python

github地址:GitHub - xianhu/LearnPython: 以撸代码的形式学习Python 很多人反应打不开,可能是因为网速的原因.内容较多,耐心等待一会! ============================================================ 自己以代码的形式整理的Python入门文档,不算空行.注释等,应该不到一千行. 认认真真读完.练习完这些代码,应该就能上手工作了. 可能在网页上显示的效果不理想,可以手动复制下来粘贴到文本文件中,利用no

千行代码入门Python

这个是从网上找到的一份快速入门python的极简教程,大概一千行左右,个人觉得不错,特此收藏以备后用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

20个正则表达式,减少千行代码

正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升. 正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r = fieldValue.match(reg); if(r==null)alert('Date

纪念一下我的第一个千行代码

告别2017的人和事,期待一下2018.SEE YOU 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <conio.h> 4 #include <string.h> 5 #include <windows.h> 6 7 void mygotoxy( int x, int y, char c ) /* 移动光标函数,方便输入时进行修改 */ 8 { 9 HANDLE hOut = Get

TangIDE游戏开发之60行代码实现打地鼠

对于没有接触过html的朋友,要实现一个最简单的html5打地鼠游戏,也是不知道从何下手的.就算是html高手,没有上千行代码,也完不成一个像样的打地鼠游戏. 网上找到一个开源的打地鼠游戏(参见下载地址),粗略看了一下代码,代码行数1000+. 今天我要介绍的打地鼠游戏,主要逻辑代码,也就60多行,所有的代码加起来也就100多行,是为某客户定制的一款比较完整的商业游戏,大部分的功能也就只是一下午的时间就能完成. 先看一下实际的成果: PC点击这里玩 手机下方扫描二维码玩 如果你想在本游戏上进行改

50行代码实现Java方法代理

工作中经常需要对现有程序进行一些扩展,而不想修改现有代码.可以使用代理方法,常使用的代理技术有JDK的java.lang.reflect.Proxy.spring的代理等. 例如对方法加事务,就常用org.springframework.transaction.interceptor.TransactionInterceptor.他就是在现有方法前面开启事务,后面关闭事务. 本文以spring+aspectj做一个简单的例子: 1.使用maven依赖的文件如下:         <depende

(转)两千行PHP学习笔记

亲们,如约而至的PHP笔记来啦~绝对干货! 以下为我以前学PHP时做的笔记,时不时的也会添加一些基础知识点进去,有时还翻出来查查. MySQL笔记:一千行MySQL学习笔记http://www.cnblogs.com/shockerli/p/1000-plus-line-mysql-notes.html //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH 变

两千行PHP学习笔记

//语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH变量名建议用下划线方式分隔 // $var_name函数名建议用驼峰命名法 // varName定界符建议全大写 // <<<DING, <<<'DING'文件名建议全小写和下划线.数字 // func_name.php私有属性名.方法名建议加下划线 // private $_name