(方面:如有错误,请勿喷,评论即可)

1.开始

什么是AOP?关于它的详细内容,可以自己用google搜索一下,能找到很多有趣的内容。事实上,现在的AOP只是对OOP的一个补充,还没有到达一个语言级别。 对于java世界里的AspectJ,我目测它的实现原理应该只是java的元编程(正如spring做的那样,只不过它提供了类似语法糖一样的东西,如果我理解错了,请java的同学们不要喷我)。

2.Spring

可以去下载它的最新版本,http://www.springsource.org/download/community  exe安装版

3.现学现卖

我先简单介绍一下AOP(参照第1条), aspect 意思可以有 切面、横面、方面或者侧面,维基百科上面写的是侧面。 如果把OOP看做纵向的编程(继承,方法调用等等),那么AOP就是横向的编程。

4.OOP举例

日志是一个很好的例子,有一个在AOP观点中很搓的实现(我敢说大部分人都是这么实现的),就是trycatch 一段程序,在catch里写日志调用的方法,如果还要记录info,可能在程序某个地方写 logger.info

public void SomeBusinessMethod(){
  logger.Info(".........");
  try{
    Operate();
  }catch(Exception e){
    logger.Error(e.Message);
  }
  finally{
    Hehe();
  }
  logger.info();
}

  

5.AOP的反驳

呵呵,如果业务逻辑中这样的方法有上百个(其实也不用上百个,30个即可),你这样一个一个去实现日志功能,我敢打赌你写到第10个就感到厌倦了——重复代码。也有人可能说,可以用一个Context实现,对于日志这个例子,也许能省掉trycatch语句块,但你还是得一便一遍的调用info error等方法。

也许在 ASP.NET中,你可以看见 Page.OnError方法 ,或者Controller.OnException方法来处理异常,Page.OnLoad ,Page.OnUnload,Controller.OnActionExecuting,Controller.OnActionExecuted方法,但这事实上已经有点AOP的味道了

是的,你可以在把方法调用前,方法返回后或者异常作为连接点,通过切入点指定这些连接点做什么(通知)

6.解决方案——Spring.NET

参照第2条,安装完Spring后,在开始菜单招到Spring.NET,然后打开AOP示例项目 (example)

Common项目包含了Aspects和Commands的几个类,ServiceCommand实现了ICommand的三个成员

把Step1 设为启动项目, 打开Program.cs, 可以看到它用了ProxyFactory代理了ServiceCommand,然后给它增加了三个方面并创建了代理对象,最后调用代理对象的三个方法。详细代码可以在示例项目中找到。 注释表明了,这是一个programmatically (编程实现AOP)

// Create AOP proxy programmatically.
                ProxyFactory factory = new ProxyFactory(new ServiceCommand());
                factory.AddAdvice(new ConsoleLoggingBeforeAdvice());
                factory.AddAdvice(new ConsoleLoggingAfterAdvice());
                factory.AddAdvice(new ConsoleLoggingThrowsAdvice());
                ICommand command = (ICommand)factory.GetProxy();

                command.Execute();
                if (command.IsUndoCapable)
                {
                    command.UnExecute();
                }

  

截图如下(为了醒目起见,我加了点分隔线)

这样就为每个方法的前与后动态地添加了行为,这些行为就是通知(Advise)。

结合日志的例子,我们就可以很方便的为每个业务方法加上这些Advise,然后做日志操作,事实上示例项目做的就是日志。

可以看到有很多Advise——Before,After,Around(环绕)和ThrowAdvise

Spring.NET 与 AOP 初窥1的更多相关文章

  1. SSM-Spring-08:Spring的静态代理初窥案例

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 静态代理 java的设计模式的代理模式,就是静态代理 写在前面的话,静态代理的优点和缺点 优点:可以在不改变一 ...

  2. 初窥ElasticSearch

    初窥ElasticSearch 官网上面的,不知道讲的是什么.. youtube上面有一个start with,内容是在windows以下跑这个elastic search,然后用一个fidler工具 ...

  3. Spring Boot2(六):使用Spring Boot整合AOP面向切面编程

    一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop ​ aop全称Aspec ...

  4. Spring 3.0 AOP (一)AOP 术语

    关于AOP.之前我已写过一个系列的随笔: <自己实现简单的AOP>,它的关注点在于实现.实现语言是C#,实现方式为 自定义实现 RealProxy 抽象类.重写Invoke方法,以便进行方 ...

  5. Spring系列之AOP实现的两种方式

    AOP常用的实现方式有两种,一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ). 首先复习下AOP中一些比较重要的概念: Joinpoint(连接点):程序执行 ...

  6. Scrapy001-框架初窥

    Scrapy001-框架初窥 @(Spider)[POSTS] 1.Scrapy简介 Scrapy是一个应用于抓取.提取.处理.存储等网站数据的框架(类似Django). 应用: 数据挖掘 信息处理 ...

  7. 初窥Kaggle竞赛

    初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...

  8. scrapy2_初窥Scrapy

    递归知识:oop,xpath,jsp,items,pipline等专业网络知识,初级水平并不是很scrapy,可以从简单模块自己写. 初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数 ...

  9. WWDC15 Session笔记 - Xcode 7 UI 测试初窥

    https://onevcat.com/2015/09/ui-testing/ WWDC15 Session笔记 - Xcode 7 UI 测试初窥 Unit Test 在 iOS 开发中已经有足够多 ...

随机推荐

  1. gravity与layout_gravity的区别

    android:gravivty 控件的内容显示位置 android:layout_gravity 控件在屏幕的布局位置,相对于容器或者父控件的位置

  2. RabbitMQ 开启WEB管理

    rabbitmq-plugins 插件管理器 1.开启rabbitmq management  -  WEB管理插件 # rabbitmq-plugins enable rabbitmq_manage ...

  3. jquery总结06-动画事件03-淡入淡出效果

    .fadeout()淡出 .fadein()淡入 .fadeTaggle()淡入淡出切换 .fadeTo()淡入设定透明度 淡入淡出fadeIn与fadeOut都是修改元素样式的opacity属性,但 ...

  4. .Net环境下的缓存技术介绍

    .Net环境下的缓存技术介绍 摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1         概念 1.1 ...

  5. (转)Linux NFS服务器的安装与配置

    转自:http://www.cnblogs.com/mchina/archive/2013/01/03/2840040.html 由于在6系列里面,portmap已经改名了 ,6系列需要使用 serv ...

  6. javascript中的事件冒泡、事件捕获和事件执行顺序

    谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有 ...

  7. Vue刨坑

    vue常见问题 1.在自定义组件里,你可以像任何普通元素一样用v-for.eg1: <my-component v-for="item in items"></m ...

  8. 用excel做分组散点图

    散点图主要观察两组变量间的趋势和分布,如果变量多于两组,仍旧使用散点图的话,那所有点都会集中在同一显示区域内,使人无法准确判断,此时一般使用散点图矩阵进行两两比较.除此之外,如果并不关心组与组之间的关 ...

  9. python——django使用mysql数据库(一)

    之前已经写过如何创建一个django项目,现在我们已经有了一个小骷髅,要想这个web工程变成一个有血有肉的人,我们还需要做很多操作.现在就先来介绍如何在django中使用mysql数据库. 前提:已经 ...

  10. jquery笔记之属性选择器 查找以某种条件开头的页面元素

    jquery笔记之属性选择器 查找以某种条件开头的页面元素 转载:http://www.blogbus.com/amyqiong-logs/78340326.html $("div[id]& ...