AOP学习-基于Emit和Attribute的简单AOP实现

简介:

关于AOP的介绍,园子里曾经有段时间非常热。

我也看了很多AOP相关的文章,对AOP的概念有一定的了解,觉得园子里的大牛张逸的AOP介绍很不错:AOP技术基础

看了很多AOP的介绍之后,很想自己实现一个简单的AOP来感受一下,但是一直苦于不知道怎么实现。

后来看了园子里的一个介绍Emit的系列(Emit学习系列文章导航),才开始在原作者的基础上实现了简单的AOP框架,仅供学习使用。

1. ThinAOP的介绍

此框架非常简单,只有几个文件。但是就是因为简单,所以可以用来学习AOP的思想。

由于主要部分是有Emit实现的,所以没有Emit基础的话,最好先看一下Emit学习系列文章导航

具体结构如下:

image

2. ThinAOP的介绍-ProxyFactory

之所以先介绍ProxyFactory,是因为ProxyFactory是ThinAOP对外的接口,对于需要使用AOP的类,需要使用ProxyFactory来生成相应的代理类。

ProxyFactory类中只有一个静态方法,就是用来生成动态代理类的。

1
2
3
4
5
6
7
8
9
10
public  class  ProxyFactory
{
     public  static  T CreateProxy<T>(Type realProxyType)
     {
         var  generator = new  DynamicProxyGenerator(realProxyType, typeof (T));
         Type type = generator.GenerateType();
 
         return  (T)Activator.CreateInstance(type);
     }
}

3. ThinAOP的介绍-Metadata

Metadata中定义了四个类:

  • ExceptionMetadata:用于保存程序中exception的信息
  • MethodMetadata   :用于保存程序中方法的信息(目前只有方法名)
  • ParameterMetadata:用于保存程序中方法的参数信息
  • ResultMetadata:用于保存程序中方法的返回值信息

通过上面定义的四个类,我们可以看出此AOP框架值主要是针对方法这个级别的拦截。即拦截方法在执行前,执行后,异常时的操作。

这四个类非常简单,只是定义了一些属性。

4. ThinAOP的介绍-InvokeContext

保存了必须的上下文信息,也就是上面定义的那些Metadata

5. ThinAOP的介绍-DynamicProxyGenerator

这个类是整个框架的核心,用来生成动态代理,在代理中完成对方法的拦截操作,并在拦截后注入自己的代码。

核心方法是GenerateType,根据现有type生成新的type

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public  Type GenerateType()
{
     // 构造程序集
     BuildAssembly();
     // 构造模块
     BuildModule();
     // 构造类型
     BuildType();
     // 构造字段
     BuildField();
     // 构造函数
     BuildConstructor();
     // 构造方法
     BuildMethods();
 
     Type type = _typeBuilder.CreateType();
     // 将新建的类型保存在硬盘上(如果每次都动态生成,此步骤可省略)
     _assemblyBuilder.Save(AssemblyFileName);
     return  type;
}

其中的Emit代码,我已经写了相应的C#代码。

Emit代码类似IL,我也是先写C#代码,然后用ILSpy转成IL代码,然后参照IL代码来写的Emit部分代码。

6. ThinAOP的介绍-AspectAttribute

这个类定义了一系列的Attribute,方便于定义拦截操作。

主要定义了3中拦截操作:分别是执行前拦截 ,执行后拦截,异常时拦截

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[AttributeUsage(AttributeTargets.Method)]
public  abstract  class  PreAspectAttribute : AspectAttribute
{
}
 
[AttributeUsage(AttributeTargets.Method)]
public  abstract  class  PostAspectAttribute : AspectAttribute
{
}
 
[AttributeUsage(AttributeTargets.Method)]
public  abstract  class  ExceptionAspectAttribute : AspectAttribute
{
}

PS.

整个框架的实现参考了博客园里很多文章,这里就不一一列举了。

除了ThinAOP的框架外,我还写了了一个使用这个框架的例子,具体请参见提供的附件:ThinAOP



本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/archive/2011/08/10/2133405.html,如需转载请自行联系原作者

目录
相关文章
|
5月前
|
负载均衡 Java 应用服务中间件
学习aop以及nginx
学习AOP和Nginx的最好方式是通过实践。你可以尝试在你的项目中使用这些技术,或者找一些在线教程进行学习。
35 1
|
6月前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
53 0
|
7月前
|
Java Maven 数据安全/隐私保护
代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!
代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!
|
Java Spring 容器
|
XML Java 数据格式
Spring5学习(七):注解方式进行AOP操作 及 多种通知类型的测试
先来介绍一下AOP操作中的几个术语: 1、连接点:指类里面可以被增强的方法 2、切入点:指实际被增强的方法 3、通知:指实际增强的逻辑部分 4、切面:把通知应用到切入点的过程
106 0
Spring5学习(七):注解方式进行AOP操作 及 多种通知类型的测试
|
XML Java 数据格式
spring aop学习
​1.aop和spring aop的关系? aop是一种思想,spring aop是aop的一种实现。 2.Spring aop和AspectJ的关系? 这两种都是实现aop的
94 0
|
XML 缓存 Java
Spring AOP注解的学习与实践
使用&quot;横切&quot;技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
138 0
Spring AOP注解的学习与实践
|
Java 微服务 Spring
【学习Seata1.6源码#02】通过Spring AOP 实现声明式事务机制
【学习Seata1.6源码#02】通过Spring AOP 实现声明式事务机制
451 0
|
XML Java 数据格式
|
XML Java Maven
详解Spring学习总结——Spring实现AOP的多种方式
详解Spring学习总结——Spring实现AOP的多种方式
详解Spring学习总结——Spring实现AOP的多种方式