spring.net AOP初探
AOP是什么?
面向切面编程,在OO中有一个开放关闭原则,及对修改关闭,对扩展开放。AOP可以说是设计模式的集合加强版,使用代理、工厂、策略等等模式,来实现方法的结合。
这样说还比较模糊,我们先往下看。
AOP中常用的名词(这个先了解一下,最后再回来看就恍然大悟了):
Pointcut(切入点):被拦截到的点。如:在保存数据的方法中加入日志的方法,那么保存数据的方法就是切入点。
Advice(通知):指拦截之后所要做的事情就是通知。如上面例子,日志的方法就是通知。通知有4类,分别是前置通知,后置通知,异常通知,环绕通知。
Target(目标对象):代理的目标对象。如上面例子,保存数据方法的对象。
代理(proxy):由框架在将通知应用于目标对象后创建的对象。程序里通过GetProxy()方法创建出的代理对象。
spring.net中的AOP
spring.net是一个依赖注入框架,这里就用它在AOP方面的功能,初步谈一下他的实现方法,进入AOP的世界。
spring.net下载地址: http://www.springframework.net/
我们使用记日志的例子来实现一个简单的AOP:
创建一个控制台应用程序。
1、申明一个保存数据的接口
public interface IDataService
{
void SaveData();
}
2、实现一个保存数据的类
namespace AOPDmo.SaveData
{
public class DataService : IDataService
{
public void SaveData()
{
Console.WriteLine("保存数据...");
}
}
}
3、一个记日志的类
public class LogAdvice : IMethodInterceptor
{
private void Log()
{
Console.WriteLine("保存数据记日志");
}
public object Invoke(IMethodInvocation invocation)
{
//Log();
object obj = invocation.Proceed();
Log();
//if (invocation.Method.Name == "") //用invocation.Method可以获取切入点的信息
//{
// Log();
//}
return obj;
}
}
记日志的类作为一个和业务无关的通知,在需要的时候调用。这里继承spring的IMethodInterceptor(环绕通知)接口来告诉框架这是一个方法拦截器,并实现接口的Invoke方法,invocation.Proceed()方法使程序执行DataService类的SaveData()方法。
4、主页面,Program
class Program
{
static void Main(string[] args)
{
ProxyFactory factory = new ProxyFactory(new DataService());
factory.AddAdvice(new LogAdvice());
IDataService service = (IDataService)factory.GetProxy();
service.SaveData();
Console.Read();
}
}
在Program中我们做了三件事情,
先告诉框架我们要对DataService做一个拦截器,用DataService作为目标对象,让框架创建一个代理工厂。
然后告诉代理工厂我们的通知是LogAdvice(可以添加多个)。
最后用代理工厂的方法factory.GetProxy()创建代理类。
执行结果:
到目前为止我们已经实现了一个简单的AOP记日志的功能,但是当我们不需要记日志了,那么就要删掉这里的代码,是不是感觉还不如直接写方法?
接下来我们用配置的方式来解决这个问题。
使用配置
创建一个xml文件
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.net
http://www.springframework.net/xsd/spring-objects.xsd">
<object id="DataService" type="AOPDmo.DataService, AOPDmo"/>
<object id="LogAdvice" type="AOPDmo.LogAdvice, AOPDmo"/>
<object id="DataProxy" type="Spring.Aop.Framework.ProxyFactoryObject, Spring.Aop">
<property name="ProxyInterfaces">
<list>
<value>AOPDmo.IDataService,AOPDmo</value>
</list>
</property>
<property name="Target">
<ref object="DataService" />
</property>
<property name="InterceptorNames">
<list>
<value>LogAdvice</value>
</list>
</property>
</object>
</objects>
头两个object是告诉框架创建代理类时所需的类名、所在程序集。
第三个object是需要创建的代理类,property是属性。
创建一个代理类同样需要做三件事:
1、属性Target(目标对象),先告诉框架我们要对DataService做一个拦截器,用DataService作为目标对象。
2、属性InterceptorNames(拦截器的名称),告诉代理工厂我们的通知是LogAdvice(可以添加多个)。
3、属性ProxyInterfaces是告诉框架代理类要继承的接口,创建代理类。
Program代码:
class Program
{
static void Main(string[] args)
{
IApplicationContext context = new XmlApplicationContext(@"XMLFile1.xml");
IDataService service = (IDataService)context.GetObject("DataProxy");
service.SaveData();
Console.Read();
}
}
执行得到一样的结果,就不贴出来了。
当我们不需要日志的时候,将配置文件的<value>LogAdvice</value>代码注释掉就可以,是不是方便多了。
AOP的应用
我们在开发项目中,经常会遇到需要记录日志的地方,比如说机票系统中,机票做Update的时候,需要记录操作人是谁,什么时候修改的。比如监控我们系统中重要方法的执行,执行了多久,是否成功等等,主要应用在和业务无关,使用频率高的方法。
这篇主要是用ProxyFactory来创建AOP代理,后面的笔记将继续写一篇关于配置方面的内容,使AOP得到更灵活的应用。
spring.net AOP初探的更多相关文章
- Spring入门(9)-AOP初探
Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...
- spring源码学习之路---AOP初探(六)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,但当初打算学习 ...
- spring源码学习(一)--AOP初探
LZ以前一直觉得,学习spring源码,起码要把人家的代码整体上通读一遍,现在想想这是很愚蠢的,spring作为一个应用平台,不是那么好研究透彻的,而且也不太可能有人把spring的源码全部清楚的过上 ...
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- Spring实现AOP的4种方式
了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“ ...
- spring的AOP
最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spr ...
- Spring(五)AOP简述
一.AOP简述 AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心, AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型 AOP ...
- Spring中AOP原理,源码学习笔记
一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...
- Spring之AOP面向切片
一.理论基础: AOP(Aspectoriented programming)面向切片/服务的编程,在Spring中使用最多的是对事物的处理.而AOP这种思想在程序中很多地方可以使用的,比如说, ...
随机推荐
- HDU 4006 The kth great number AVL解
提供动态更新数据.第实时QK大量的值什么? 使用AVL统计数据结构做,比较先进的数据结构的内容. 不知道给出的数据为准值是否有反复.下面的程序是因为我能够处理重复数据出现的情况下,. 了repeat的 ...
- c# 字符串切割 split
一直以来 都以为 string.split 里面 就只能是 一个 char 实际不是 那么回事 参数 可以是 string. eg: string strtest = "asdfg12we ...
- sql server 查看表的行数
SELECT a.name , b.[rows]FROM dbo.sysobjects AS a LEFT JOIN sysindexes AS b ON a.id ...
- vi使用高级
下面的命令在vi命令模式被激活 h 光标左移一个字符 l 光标向右移动一个字符 j 光标下移一行 k 移动光标线 一.对整行操作 1.复制光标所在行 yy 2.删除光标所在行 dd 3.选中光标所在行 ...
- 如何查看IC卡燃气表读数和剩余量?
如今新建的楼房都是使用IC卡燃气表,拿到房子入住时也没有见到IC卡燃气表的使用说明书.非常多人可能为此而苦恼.这里就讲一下怎样查看IC卡燃气表读数及剩余金额. 产品外观 可选功能 watermark/ ...
- shell 批量压缩指定文件夹及子文件夹内图片
shell 批量压缩指定文件夹及子文件夹内图片 用户上传的图片,一般都没有经过压缩,造成空间浪费.因此须要编写一个程序,查找文件夹及子文件夹的图片文件(jpg,gif,png),将大于某值的图片进行压 ...
- 数据库备份还原工具EMS SQL Angel for SQL Server发布1.3版本
EMS公司,是专门从事企业数据库以及内置于多层次客户服务器结构自动化开发.其EMS SQL Angel for SQL Server工具,便是SQL Servers数据库数据备份还原工具,并且还能使用 ...
- 实例学习SSIS(四)--使用日志记录和错误流重定向
原文:实例学习SSIS(四)--使用日志记录和错误流重定向 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习 ...
- .net图片压缩
1.png很难进行压缩,一般压缩时间较长. 2.jpg图片压缩方法: #region 图片压缩[之压缩jpg] public static void JpgImgZip(Image img,strin ...
- ref引用类型,数组型参数,out输出参数
ref和out的相同点和不同点 共同点:都是引用传递不同点:ref的参数在调用之前一定要赋值,在方法调用的过程中可以不要赋值. out的参数在调用之前可以不赋值,在方法调用的过程中一定要赋值. ...