Spring.Net AOP实例
Spring.Net和Log4net、NUnit、NHibernate一样,也是先从Java中流行开来,然后移植到了.NET当中,形成了.NET版的Spring框架。其官方网站为:http://www.springframework.net/index.html。
首先看一下Spring.Net的架构图:

根据架构图可以看到,它的底层核心是Spring Core,上层是AOP层。其它的什么NHibernate、ES、WCF都基于这两个底层。
看了这个架构图只是了解了Spring框架所提供的功能,那么Spring.Net究竟是什么呢?它对我们开发来说究竟有什么样的帮助呢?
简单来说,Spring.Net是一个关注.NET企业应用开发的应用程序框架。它的核心思想是AOP(面向切面编程或者叫面向方面编程),与面向对象不同,它关注的是程序的“切面”,即横向的内容(比如日志、验证等通用型的功能)。随着软件系统规模的不断升级,复杂程度越来越高,面向对象就有了它的弊端,这时候引入AOP就能有效的解决问题。从系统中分离出来方面,然后集中实现。从而可以独立编写业务逻辑代码和方面代码,在系统运行的时候,再将方面代码“织入”到系统中,使得系统的功能得以扩展。
提到Spring.Net除了想到AOP之外,还有一个就是IOC(控制反转)或者DI(依赖注入)。主要意思就是明确的定义组件接口,独立的开发各个组件,然后通过组件之间的依赖关系进行组装,进而成为一个完整的系统。
好了,我从来不喜欢讲太多的理论,我喜欢用一些小例子让大家快速的上手这个技术。由于Spring.Net是个相对比较庞大的内容,因此下面就介绍一下具体使用Spring.Net实现AOP的过程。
首先先下载Spring.Net。这个可以在官方链接中找到或者百度下一个。目前最新的版本号为1.3.2,建议读者下载最新版本。
如果你下的是zip包,可以直接解压缩。如果是msi安装包,则你可以选择路径进行安装。里面有Spring.Net的核心dll文件、doc文档和一些例子。由于Spring.Net是开源的,因此你还会看到有项目的源代码在里面,对底层源码感兴趣的读者也可以拿出来学习使用。
一、建立一个类库项目BIZ
BIZ是一个业务逻辑处理模块,首先定义一个业务接口以及其实现类:
namespace BIZ.Commands
{
public interface IStudentService
{
void GoToSchool(string studentName, string className);
}
}
namespace BIZ.Commands
{
public class StudentService : IStudentService
{
public void GoToSchool(string studentName, string className)
{
Console.WriteLine("计算机({1})班的{0}同学去上学了。。。", studentName, className);
}
}
}
这里我模拟一下任务,就是一个学生去上学的业务逻辑处理。
接下来,在这个项目中建立一个LogBeforeAdvice类并实现IMethodBeforeAdvice接口。这里面需要添加引用Spring.Net的一些dll文件,比如Spring.Core、Spring.Aop等,这些都可以在Spring.Net目录中找到。
namespace BIZ.Aspects
{
public class LogBeforeAdvice : IMethodBeforeAdvice
{
public void Before(System.Reflection.MethodInfo method, object[] args, object target)
{
Console.WriteLine("拦截的方法名—>" + method.Name);
Console.WriteLine("目标—>" + target);
Console.WriteLine("参数—>");
if (args != null)
{
foreach (object arg in args)
{
Console.WriteLine("\t: " + arg);
}
}
}
}
}
这里需要说明一下,这里实现的接口叫“前置通知”,除此之外还有“后置通知”、“环绕通知”、“异常通知”等共四种类型的通知。
前置通知是在方法执行前自动执行的通知;后置通知是在方法执行后自动执行的通知;环绕通知可以在方法调用前执行通知代码,可以决定是否还调用目标方法;异常通知是方法抛出异常时自动执行的方面代码。(注:其它三种通知可以自行添加实现,这里只演示前置通知。)
二、建立一个控制台应用程序SpringNetAop
在App.config(新版本的VS都能够自动生成这个文件,如果没有自动新建一个)中,添加Spring.Net的相关配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections> <spring>
<context>
<resource uri="config://spring/objects"/>
</context> <objects xmlns="http://www.springframework.net">
<description>AOP例子</description>
<object id="beforeAdvice" type="BIZ.Aspects.LogBeforeAdvice,BIZ"/>
<object id="myStudentService" type="Spring.Aop.Framework.ProxyFactoryObject">
<property name="Target">
<object type="BIZ.Commands.StudentService, BIZ" />
</property>
<property name="InterceptorNames">
<list>
<value>beforeAdvice</value>
</list>
</property>
</object>
</objects> </spring>
</configuration>
这里面就是核心的配置内容。通过config文件装配需要注入的对象并织入到StudentService这个业务逻辑类中,这样就完成了组装。
然后在Program.cs中写入如下代码:
namespace SpringNetAop
{
class Program
{
static void Main(string[] args)
{
IApplicationContext context = ContextRegistry.GetContext();
IStudentService command = (IStudentService)context["myStudentService"];
command.GoToSchool("guwei4037", "一");
}
}
}
同样的也需要引用Spring.Core和Spring.Aop的dll文件。
好,运行一下控制台程序。

可以看到,在我调用上学的方法时,先执行了方面代码里的内容。
通过这个例子,我们认识到Spring.Net可以根据需要动态的装配组件,并可以在执行某个方面代码前自动执行我们所要的操作。可以想象,这个功能完全可以使用在我们对业务操作进行日志记录的场合,在调用方法时还是去上学,但是通过前置通知我们增加了日志记录功能。
好了,关于Spring.Net的AOP部分就讲解到这里,这里只是简单讲解了一小部分的Spring.Net的内容,主要目的是让大家对Spring.Net有个基本的认识。如果需要更多详细的资料,可以查看相关文档资料:http://www.springframework.net/documentation.html。
Spring.Net AOP实例的更多相关文章
- spring(13)------全面深入解析spring的AOP
一,AOP的基本思想 AOP(Aspect Oriented Programming)翻译成中文的大意是面向切面编程,主要目的解决让不该牵扯在一起的代码分离开来. (1)认识AOP 应用程序中通常包含 ...
- Spring学习笔记IOC与AOP实例
Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...
- Java框架spring 学习笔记(十二):aop实例操作
使用aop需要在网上下载两个jar包: aopalliance.jar aspectjweaver.jar 为idea添加jar包,快捷键ctrl+shift+alt+s,打开添加jar包的对话框,将 ...
- Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置
用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before.@Around和@After等advice.最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了A ...
- Spring的AOP配置文件和注解实例解析
1.1 Spring的AOP配置文件和注解实例解析 AOP它利用一种称为"横切"的技术,将那些与核心业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减 ...
- Spring Aop实例
一.XML方式 1. TestAspect:切面类 package com.spring.aop; import org.aspectj.lang.JoinPoint; import org.aspe ...
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- 转载:Spring+EhCache缓存实例
转载来自:http://www.cnblogs.com/mxmbk/articles/5162813.html 一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干 ...
- Spring Rabbitmq HelloWorld实例
之前的博客和大家分享了Rabbitmq的基本框架,及其工作原理,网址为 < http://www.cnblogs.com/jun-ma/p/4840869.html >.今天呢,想和大家一 ...
随机推荐
- android常见错误--INSTALL_FAILED_DEXOPT
出现上面的问题,是由于手机的内存不足导致的,需要清理一下手机的内存,然后就可以了
- GridView拖动效果实现
GridView拖动效果实现 1. 重新GridView控件 package com.whbs.drag.widget; import com.whbs.drag.DragGridActivit ...
- iOS开发——高级技术&支付宝功能的实现
支付宝功能的实现 现在不少app内都集成了支付宝功能 使用支付宝进行一个完整的支付功能,大致有以下步骤: 1>先与支付宝签约,获得商户ID(partner)和账号ID(seller) (这个 ...
- Struts2中的类型转换
1. Struts2中的类型转换 我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种.所以,我们需要类型转换! 在Struts2中,类型转换的概 ...
- Linux性能及调优指南(翻译)之Linux内存架构
http://blog.csdn.net/ljianhui/article/details/46734115
- [010]转+修正---C++的贪吃蛇程序(未用面向对象封装)
在网上看到一段贪吃蛇程序,自己心痒下了下来又稍微做了一点修改. 没有用面向对象的方式来进行封装,下次准备试试. 需要在windows环境下进行编译 #include<iostream> # ...
- Helpers\Data
Helpers\Data Data helper contains a bunch of useful methods for looking at and altering your data. D ...
- 设置su和sudo为不需要密码
设置su和sudo为不需要密码 一 设置sudo为不需要密码 有时候我们只需要执行一条root权限的命令也要su到root,是不是有些不方便?这时可以用sudo代替.默认新建的用户不在sudo组, ...
- Debian 7 安装Firefox
Debian 7默认自带的浏览器叫做 iceweasel,据维基百科介绍是Mozilla Firefox浏览器的一个再发布版,从Debian 4 开始默认安装. 本文内容:安装Firefox.安装Fl ...
- S2-020 Struts ClassLoader Manipulation安全限制绕过(CVE-2014-0094)
受影响系统: Apache Group Struts 2.x 描述: ----------------------------------------------------------------- ...