Spring.NET 与 AOP 初窥1
(方面:如有错误,请勿喷,评论即可)
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的更多相关文章
- SSM-Spring-08:Spring的静态代理初窥案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 静态代理 java的设计模式的代理模式,就是静态代理 写在前面的话,静态代理的优点和缺点 优点:可以在不改变一 ...
- 初窥ElasticSearch
初窥ElasticSearch 官网上面的,不知道讲的是什么.. youtube上面有一个start with,内容是在windows以下跑这个elastic search,然后用一个fidler工具 ...
- Spring Boot2(六):使用Spring Boot整合AOP面向切面编程
一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop aop全称Aspec ...
- Spring 3.0 AOP (一)AOP 术语
关于AOP.之前我已写过一个系列的随笔: <自己实现简单的AOP>,它的关注点在于实现.实现语言是C#,实现方式为 自定义实现 RealProxy 抽象类.重写Invoke方法,以便进行方 ...
- Spring系列之AOP实现的两种方式
AOP常用的实现方式有两种,一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ). 首先复习下AOP中一些比较重要的概念: Joinpoint(连接点):程序执行 ...
- Scrapy001-框架初窥
Scrapy001-框架初窥 @(Spider)[POSTS] 1.Scrapy简介 Scrapy是一个应用于抓取.提取.处理.存储等网站数据的框架(类似Django). 应用: 数据挖掘 信息处理 ...
- 初窥Kaggle竞赛
初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...
- scrapy2_初窥Scrapy
递归知识:oop,xpath,jsp,items,pipline等专业网络知识,初级水平并不是很scrapy,可以从简单模块自己写. 初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数 ...
- WWDC15 Session笔记 - Xcode 7 UI 测试初窥
https://onevcat.com/2015/09/ui-testing/ WWDC15 Session笔记 - Xcode 7 UI 测试初窥 Unit Test 在 iOS 开发中已经有足够多 ...
随机推荐
- json提交数据到服务端
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Courier New"; color: #393939; backgr ...
- Java链接MySQL练习题:格式化日期、性别;避免代码注入
一.查询人员名单,按序号 姓名 性格(男或女) 民族(某族) 生日(年月日)输出 import java.sql.*; import java.text.SimpleDateFormat; publi ...
- log4jWARN Please initialize the log4j system properly解决办法
原因是没有对log4j这个jar进行文件配置. 要解决这个问题非常简单,建立LOG4J 的配置文件即可.在src 目录下创建配置文件,选择菜单File > New > File,文件名输入 ...
- Pod(转)
一.CocoaPods的安装 (1)使用淘宝的Ruby镜像替换官方的ruby源,在终端输入命令 $ gem sources --remove https://rubygems.org/ $ gem s ...
- easyui combobox 左匹配模糊查询
之前一直不知道,easyui 的combobox还有从左匹配查询显示数据的. 样式是这样的:(这是数据是已经存在下拉列表里的) 在这样操作的时候,遇到了一个问题.(其实也不算问题的). 就是操作人员在 ...
- Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享
架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要 ...
- mac下安装nginx+php+mysql+xdebug
一,安装homebrew 就像linux下面有yum一样,mac也有个homebrew,管理软件非常便捷. 官网:http://brew.sh/index_zh-cn.html 上面有句命令,复制下来 ...
- c3p0连接池获得的Connection执行close方法后是否真的销毁Connection对象?
问题描述: jfinal做的api系统中,在正常调用接口一段时间后,突然再调用接口的时候,该请求无响应api系统后台也无错误信息 (就是刚开始接口调用是正常的,突然就无响应了) 于是啊,就开始找错误. ...
- Spring的注解
Action想使用serviceImpl时,都需要最原始的方法New一个接口,Service service = new serviceImpl();去实例化service了.都需要Action主动创 ...
- UDP的connect函数
UDP的connect没有三次握手过程,内核只是检测是否存在立即可知的错误(如一个显然不可达的目的地), 记录对端的的IP地址和端口号,然后立即返回调用进程. 未连接UDP套接字(unconnecte ...