AOP 术语

通知(Advice): 通知描述了切面要完成的任务,同时还描述了何时执行这个任务。

连接点(Joinpoint):  程序中应用通知的地方称为连接点,这个点可以是方法被调用时,异常抛出时,甚至访问属性的时候。

切入点(Pointcut): 切入点定义通知切入的一个或者多个连接点。

切面(Aspect): 切面就是通知和切入点的结合。通知和切入点共同定义了切面的全部内容:功能、时机、位置。

引入(Introduction): 允许我们想现有类中增加属性和方法.

目标(Target): 被通知的对象

代理(Porxy): 向目标对象增加通知之后,创建的对象,由这个对象来访问实际的目标对象。

织入(Weaving): 被切面应用到目标对象来创建新的代理对象的过程。

Spring 对 AOP 的支持

Spring.NET 直接使用 C# 来编写通知。

Spring.NET 在运行时进行通知。

Sprint 支持方法的连接点

Spring.NET 使用标记接口 AopAlliance.Aop.IAdvice 来定义通知,这个接口又有四个直接的派生接口,还有两个间接地派生接口。

Spring.Aop.IAfterReturningAdvice,定义方法执行之后的通知,通知的方法名为 AfterReturning

Spring.Aop.IBeforeAdvice,定义所有的前置通知,还是一个标记接口

Spring.Aop.IMethodBeforeAdvice,方法的前置通知接口,通知的方法名称为 Before

AopAlliance.Intercept.IInterceptor, 环绕通知的接口,也是一个标记接口

AopAlliance.Intercept.IMethodInterceptor,方法的环绕通知接口,Invoke 是调用方法。

Spring.Aop.IThrowsAdvice,异常的通知方法,是一个标记接口,但是,实现类中必须存在一个名为 AfterThrowing 的方法,方法可以有任意的返回类型。系统其实是通过反射来调用这个方法的。

这个方法的签名如下:

public void AfterThrowing(Exception ex)

下面的例子来自 Spring In Action ,这里使用 C# 在 Spring.NET 中实现

首先是骑士的接口,切入点必须通过接口实现。

// 定义被代理方法的接口 public interface IKnight {     String Name { set; get; }     HolyGrail embarkOnQuest(); }

然后,是骑士的定义,这里实现了这个接口。

// 被代理的方法必须通过接口实现 public class KnightOfTheRoundTable     : IKnight {     public String Name { set; get; }     public IQuest Quest { set; get; }
public HolyGrail embarkOnQuest() { return Quest.Embark(); } }

诗人的定义

// 一个行吟诗人 public class Minstrel {     public void singBefore(IKnight knight)     {         Console.WriteLine("Fa la la; Sir " + knight.Name + " is so brave!"); }     public void singAfter(IKnight knight)     {         Console.WriteLine("Tee-hee-he; Sir " + knight.Name + " did embark on a quest!");     } }

通知者,这里使用环绕通知。

// 每个类只能实现一个接口 public class Advisor :     AopAlliance.Intercept.IMethodInterceptor        // 使用环绕通知 {     public Minstrel Minstrel { set; get; }
public object Invoke(AopAlliance.Intercept.IMethodInvocation invocation) { IKnight knight = invocation.Target as IKnight; // 取得骑士 this.Minstrel.singBefore(knight); // 前置通知 object result = invocation.Proceed(); this.Minstrel.singAfter(knight); // 后置通知 return result; } }

其他的辅助类定义,任务等等。

public interface IQuest {     HolyGrail Embark(); }
public class HolyGrailQuest : IQuest { public HolyGrail Embark() { Console.WriteLine("探险任务中......"); return new HolyGrail(); } }

在配置文件中,进行切入。

<?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net" xmlns:aop="http://www.springframework.net/aop">
<!-- 任务 --> <object id="quest" type="AOP_2.HolyGrailQuest" singleton="true"></object> <!-- 骑士 --> <object id="knight" type="AOP_2.KnightOfTheRoundTable" dependency-check="all"> <property name="Quest" ref="quest"></property> <property name="Name" value="Smith"></property> </object>
<!--诗人--> <object id="minstrel" type="AOP_2.Minstrel"/> <!--通知--> <!-- 环绕通知,通知的类型由定义的类型确定 --> <object id="advisor" type="AOP_2.Advisor"> <property name="Minstrel" ref="minstrel"></property> </object> <!--定义切入点--> <object id="pointcut" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop"> <property name="pattern" value="AOP_2.KnightOfTheRoundTable.embarkOnQuest"/> </object> <!--切面--> <aop:config> <aop:advisor pointcut-ref="pointcut" advice-ref="advisor"/> </aop:config>
</objects>

控制台的主程序。

Spring.Context.IApplicationContext context     = new Spring.Context.Support.XmlApplicationContext("objects.xml");
IKnight knight = context.GetObject("knight") as IKnight; knight.embarkOnQuest();

完整代码下载:点击下载

spring.net AOP的更多相关文章

  1. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  2. Spring实现AOP的4种方式

    了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“ ...

  3. spring的AOP

    最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spr ...

  4. Spring(五)AOP简述

    一.AOP简述 AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心, AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型 AOP ...

  5. Spring中AOP原理,源码学习笔记

    一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...

  6. Spring之AOP面向切片

       一.理论基础: AOP(Aspectoriented programming)面向切片/服务的编程,在Spring中使用最多的是对事物的处理.而AOP这种思想在程序中很多地方可以使用的,比如说, ...

  7. 利用CGLib实现动态代理实现Spring的AOP

    当我们用Proxy 实现Spring的AOP的时候, 我们的代理类必须实现了委托类的接口才能实现. 而如果代理类没有实现委托类的接口怎么办? 那么我们就可以通过CGLib来实现 package cn. ...

  8. spring之aop概念和配置

    面向切面的一些概念: 简单说: 连接点就一些方法,在这些方法基础上需要额外的一些业务需求处理. 切入点就是方法所代表的功能点组合起来的功能需求. 通知就是那些额外的操作. 织入就是使用代理实现整个切入 ...

  9. Spring的AOP与代理

    spring 支持两种注入方式: setter/constructor 支持多种配置方式: xml/java5注解/java类配置 支持两种事务管理: 声明性/编程性 实际上上述方式只有一个就能保证系 ...

  10. Spring 实践 -AOP

    Spring 实践 标签: Java与设计模式 AOP引介 AOP(Aspect Oriented Programing)面向切面编程采用横向抽取机制,以取代传统的纵向继承体系的重复性代码(如性能监控 ...

随机推荐

  1. loadFileSystems error & ExceptionUtils错误原因分析

    loadFileSystems error & ExceptionUtils错误原因分析 一见 2014/5/7 C/C++程序通过hdfs.h访问HDFS,运行时遇到如下错误,会是什么原因了 ...

  2. 第05章 管理ElasticSearch

    本章内容 如何选择正确的目录实现,使得ElasticSearch能够以高效的方式访问底层I/O系统. 如何配置发现模块来避免潜在的问题. 如何配置网关模块以适应我们的需求. 恢复模块能带来什么,以及如 ...

  3. 编写高质量代码改善C#程序的157个建议——建议113:声明变量前考虑最大值

    建议113:声明变量前考虑最大值 假设正在开发一个工资系统,其中一个模块负责处理加薪.代码如下: static void Main(string[] args) { ; salary = (); Co ...

  4. jquery cookie用法

    jquery cookie用法(获取cookie值,删除cookie) cookie在jquery中有指定的cookie操作类,下面我先来介绍我们在使用cookie操作类时的一些问题,然后介绍正确的使 ...

  5. HBASE与hive对比使用以及HBASE常用shell操作。与sqoop的集成

    2.6.与 Hive 的集成2.6.1.HBase 与 Hive 的对比1) Hive(1) 数据仓库Hive 的本质其实就相当于将 HDFS 中已经存储的文件在 Mysql 中做了一个双射关系,以方 ...

  6. VC++中GDI和GDI+ 的坐标系统介绍

    在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统.Windows提供了几种映射方式,每一种映射都对应着一种坐标系.例如,绘制图形时,必须给出图形各个点在客户区的位置,其位置用x 和y两 ...

  7. Javascript:splice() 方法浅析

    定义和用法: splice()方法用于插入.删除或替换数组的元素. 注:该方法会改变原始数组,splice() 方法与 slice() 方法的作用是不同的,splice() 方法会直接对数组进行修改 ...

  8. spring-第二章-AOP

    一,回顾 1.控制反转(IOC) 以前创建对象,由我们自己决定,现在我们把管理对象的声明周期权力交给spring; 2.依赖注入(DI) A对象需要B对象的支持,spring就把B注入给A,那么A就拥 ...

  9. bzoj1050旅行

    题目链接 其实没有辣么难, 暴力枚举最小边是哪条边,然后每次跑一边最小生成树, 当$s,t$刚好联通时最后加的边的权值就是当前的最大边最小的情况 然后判断一下,更新答案就好 /************ ...

  10. (STM32F4) SysTick理解使用

    關於Cortex System Timer (Systick) 網上隨便google就可以找到許多相關範例. 他就是ARM提供的一個24-bit的下數(count-down)計時器我看大部分應用都是提 ...