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

那么什么是面向方面(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. laravel 5.5 《电商实战 》辅助函数

    Laravel 提供了很多 辅助函数,有时候我们也需要创建自己的辅助函数. 这里介绍了 tinker,一个laravel内置的php交互式控制台,方便调试php代码 php artisan tinke ...

  2. scala-数组操作

    package com.bigdata import scala.collection.mutable.ArrayBuffer object ArrayO { def main(args: Array ...

  3. 20155202张旭 Exp7 网络欺诈技术防范

    20155202张旭 Exp7 网络欺诈技术防范 基础问题回答 通常在什么场景下容易受到DNS spoof攻击? 在同一局域网下比较容易受到DNS spoof攻击,攻击者可以冒充域名服务器,来发送伪造 ...

  4. 20155229《网络对抗技术》Exp4:恶意代码分析

    实验内容 使用schtasks指令监控系统运行 schtasks指令:允许管理员在本地或远程系统上创建计划任务. SCHTASKS /Create [/S system [/U username [/ ...

  5. Hadoop日记Day13---使用hadoop自定义类型处理手机上网日志

    测试数据的下载地址为:http://pan.baidu.com/s/1gdgSn6r 一.文件分析 首先可以用文本编辑器打开一个HTTP_20130313143750.dat的二进制文件,这个文件的内 ...

  6. springboot 设置 session 过期时间

    application.properties server.session.timeout=86400 #单位(s) 这里是24小时

  7. CS190.1x-ML_lab4_ctr_student

    这次lab主要主要是研究click-through rate (CTR).数据集来自于Kaggle的Criteo Labs dataset.相关ipynb文件见我github. 作业分成5个部分:on ...

  8. Linux部署DotNetCore记录

    一.背景 最近半年或最近三个月来,公司在计划大刀阔斧的规划重构新的产品.按目前的计划和宣传还是很令人期待的.前端预计应用现在很流行的前端框架,有Vue.ElementUI等,后端宣传了很多微服务.持续 ...

  9. Phabricator 在 centos 系统下发送 Email的配置

    前言 phabricator 配置email 其实很简单,配好smtp 服务器.端口.协议.用户名和登陆密码,但过程却好麻烦. 开始时跟着官网配 sendmail ,又 google 又 baidu, ...

  10. Flume的简单理解

    由于没具体研究过画图,以前在公司每天都用Excel,所以很多图画都是画在了Excel上再剪切的,看着可能不太舒服. 先来看一下数据走向: 这样我们就大致了解了flume是干嘛的,在什么位置了. Flu ...