在学习编程这段时间我想大家都是习惯了面向过程或者面向对象的思想来编程,较少或者没有接触过面向方面编程的思想。

那么什么是面向方面(Aspect)——其实就是与核心业务处理逻辑无关的切面,例如记录日志、事务控制、缓存处理、权限控制等。

这些行为与商业核心业务逻辑是毫无关系的也就是可以完全剥离出来形成一个统一的解决方案,其实这就是Aop的核心思想。接下

来讲解关于微软提供的Unity组件中的AOP。

一、AOP中的几个概念

1):切面(Aspect):对横切性关注点的抽象,说白了就是对某种功能的抽象,日志、事务、权限等都是一个切面;

2):连接点(Joinpoint):在核心业务逻辑中可以进行切入的点,可以理解为切入点的集合(商业逻辑中可能要切入日志、权限、事务等,这些就是连接点);

3):切入点(Pointcut):指对连接点进行拦截的定义,切入点决定了Advice需要切入的具体连接点,Advice->Pointcut->Joinpoint;

4):通知(Advice):拦截到连接点之后所要做的事情(前置通知、返回后通知、环绕通知、抛出异常后通知等);

5):目标对象(Target Object):需要代理的目标对象,目标对象本身只剩下了干净的业务代码,日志、权限等功能需要AOP切入;

6):代理对象(Proxy Object) : 通过AOP容器产生的对象,是由Target Object与共有的Advice(日志、权限、事务)组成的;

7):织入(Weave):指将切面应用到target对象并导致proxy对象创建的过程称为织入(编译时发生,最终会在.dll文件中生成);

8):引入(Introduction):在不修改类代码的前提下,引入可以在运行期为类动态地添加一些方法或字段(运行时动态植入);

二、三种拦截方式

拦截类型 描述 使用条件
透明代理拦截(Transparent Proxy Interceptor) 实例拦截,代理对象是通过.NET的TransparentProxy/RealProxy创建的 当需要拦截的类型继承自MarshalByRefObject或其实现类
接口拦截(Interface Interceptor) 实例拦截,仅能代理目标对象的一个接口,resolve动态创建目标实例的代理类 当接口及其子类在容器中映射过
虚方法拦截(Virtual Method Interceptor) 类型拦截,动态创建当前拦截类型的派生类的实例而不是当前类型,并在实例上切入行为 仅当虚方法需要被拦截时

以上三种根据自己的使用场景自由选择,一般来说使用接口拦截的场景要多一些。以下是优势与劣势对比:

   1):Transparent Proxy Interceptor  

             优势是能拦截目标对象的所有方法包括虚方法、非虚方法或接口;

劣势是目标对象必须直接或间接继承自MarshalByRefObject,如果没有那么只能拦截接口方法,而且这种拦截比常规方法调用要慢。

2):Interface Interceptor

             优势是能够拦截目标接口的任何子类对象,而且比Transparent Proxy Interceptor要快速;

劣势是仅能拦截单一接口中的方法(A继承自接口B和C,如果拦截接口B则只能拦截B中的方法,不能拦截C中的方法),

而且代理对象不能强制类型转换为目标对象类型或目标对象实现的其他接口类型。

3):Virtual Method Interceptor

             优势是比Transparent Proxy Interceptor要快速;

劣势是只能拦截虚方法,而且只能在对象创建时进行拦截,而不能对一个已经存在的对象进行拦截。

            

三、接口拦截简单示例

1):怎么让容器支持拦截?

可以通过Unity自带的API为容器配置拦截特性让容器支持拦截,在UnityContainer的Extensions成员中可以看到InterceptionExtension

1 IUnityContainer container = new UnityContainer();
2 container.AddNewExtension<Interception>();

2):怎么让能够进行拦截的容器拦截需要拦截的接口类型?

需要为容器注册映射类型,使用RegisterType方法

1 container.RegisterType<TestInterface, TestClass>(
2 new Interceptor<InterfaceInterceptor>(),
3 new InterceptionBehavior<UnityLogInterceptBehavior>(),
4 new InterceptionBehavior<UnityCacheInterceptBehavior>());
1  Container.RegisterType(
2 interfaceType,
3 classType,
4 action,
5 new Interceptor<InterfaceInterceptor>(),
6 new InterceptionBehavior(new AccLogInterceptorBehavior()),
7 new InterceptionBehavior(new ExcpLogInterceptorBehavior()));

3):怎么能够让拦截行为生效?

只要有了目标对象的代理对象就能对目标对象的意代理接口中的方法进行拦截

1 var obj = container.Resolve<TestInterface>();   // 针对2中的第一种
1 var obj = container.Resolve(interfaceType, action);   // 针对2中的第二种

三、使用到的DLL

    Microsoft.Practices.Unity.dll

Microsoft.Practices.Unity.Interception.dll

附:

Demo下载路径:http://files.cnblogs.com/files/xy-nb/AopDemo.zip

以上只是对微软提供的Unity组件中Aop学习的一点笔记,比较适合初学者看看;有什么问题大家多多指正,相互学习。

Aop学习笔记的更多相关文章

  1. Spring入门IOC和AOP学习笔记

    Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...

  2. AOP学习笔记一

    软件开发的目的是为了解决各种需求,包括业务需求和系统需求.目前,业界通过使用面向对象的编程思想,已经可以对业务需求等普通关注点进行很好的抽象与封装,并且使之模块化.但是对于系统需求一类的关注点来说,情 ...

  3. Spring AOP学习笔记01:AOP概述

    1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...

  4. Spring AOP学习笔记02:如何开启AOP

    上文简要总结了一些AOP的基本概念,并在此基础上叙述了Spring AOP的基本原理,并且辅以一个简单例子帮助理解.从本文开始,我们要开始深入到源码层面来一探Spring AOP魔法的原理了. 要使用 ...

  5. Spring AOP学习笔记03:AOP的核心实现之获取增强器

    上文讲了spring是如何开启AOP的,简单点说就是将AnnotationAwareAspectJAutoProxyCreator这个类注册到容器中,因为这个类最终实现了BeanPostProcess ...

  6. Spring AOP学习笔记05:AOP失效的罪因

    前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...

  7. AOP 学习笔记

    代理是一个设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象. 好处:可以在目标对象实现的基础上,增强额外的功能操作. Cglib 代理,也叫作 子类代理. JDK的动态代理有一个限制, ...

  8. AOP学习笔记二

    Spring AOP采用Java作为AOP的实现语言(AOL),学习曲线平滑,Spring AOP对AspectJ也提供了很好的集成与支持.最为第二代的AOP,采用动态代理机制和字节码生产技术实现,在 ...

  9. Spring AOP学习笔记

      Spring提供了一站式解决方案:          1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系          2) Spring Web ...

随机推荐

  1. Flutter - 添加从左向右滑动,返回上一个页面

    很多App比如微信.IT之家等都支持从屏幕左侧向右滑动,来返回上一个页面. 很多iOS上的App也都支持. 那么这个神奇的手势滑动是怎么实现的呢? 其实非常简单,只需要添加一句话即可. platfor ...

  2. 大数据入门第二十三天——SparkSQL(二)结合hive

    一.SparkSQL结合hive 1.首先通过官网查看与hive匹配的版本 这里可以看到是1.2.1 2.与hive结合 spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然 ...

  3. 大数据入门第十五天——HBase整合:云笔记项目

    一.功能简述 1.笔记本管理(增删改) 2.笔记管理 3.共享笔记查询功能 4.回收站 效果预览: 二.库表设计 1.设计理念 将云笔记信息分别存储在redis和hbase中. redis(缓存):存 ...

  4. VB CompactDatabase 压缩/修复数据库

    Option Explicit Private Sub Command1_Click() On Error GoTo err Dim DbEngine, dbFile As String dbFile ...

  5. Django Rest Framework源码剖析(六)-----序列化(serializers)

    一.简介 django rest framework 中的序列化组件,可以说是其核心组件,也是我们平时使用最多的组件,它不仅仅有序列化功能,更提供了数据验证的功能(与django中的form类似). ...

  6. WebService快速上手

    一.WebService是什么? 核心特征:跨语言.跨平台.远程调用[如果是本地系统交互,使用rpc或者com技术就行] soap:HTTP + XML [基于Http的xml格式数据交互] wsdl ...

  7. mysql存储blob限制

    一.Mysql存储类型分类: 1.blob:二进制大对象(字节流),可以用来存储图片.视频等,没有字符集的说法 2.text:文本大对象(字符流),存储大型字串,有字符集的说法 3.二者使用时不能指定 ...

  8. Luogu P1726 上白泽慧音

    这显然是一道求强连通分量(SCC)的题目. 只要你正常,都知道应该写Tarjan. 然后(假装会写Tarjan),其实我当然不会.但是求SCC还有另一个算法.复杂度和Tarjan一样,只不过常数大了点 ...

  9. dxp altium pcb里面如果想让重叠的两个元件不报错怎么设置?

    dxp的设置是Design Rules里面有个Placement选项,把第一个的钩去掉即可.

  10. P2463 [SDOI2008]Sandy的卡片

    写一种\(O(nm)\)的做法,也就是\(O(\sum 串长)\)的. 先通过差分转化,把每个数变成这个数与上一个数的差,第一个数去掉,答案就是最长公共子串+1 按照套路把所有串拼起来,中间加一个分隔 ...