Spring.NET的AOP怎么玩

之前公司一直不让使用第三方组件,因此AOP方面的组建一直不能使用,很多面向切面的应用只能通过自己写一些GenericMethod的泛型方法来解决,有一些呆板。由于公司已经开始全面转Java,因此架构组放开了第三方组件的使用,这儿将对Spring.NET进行一个基础的学习。该项目虽然有1年都没有更新了(也反映了.NET品台热度的下降),但可以为未来使用JAVA最一定的铺垫,因此还是决定干了。

Spring.NET文档及官方地址:http://www.springframework.net/documentation.html

版本选择:1.3.2,创建日期为20110801.蛋蛋的忧伤。

Spring AOP基本原理:使用代理模式实现

这部分主要涉及两部分的内容,一种是通过代码添加Advices,一种是通过配置,推荐后者。

  • 应用建议(Applying advice):应用于类中所有方法,粒度太粗。 1 public class ConsoleLoggingAroundAdvice : IMethodInterceptor 2 { 3 public object Invoke(IMethodInvocation invocation) 4 { 5 Console.Out.WriteLine("Advice executing; calling the advised method..."); 6 object returnValue = invocation.Proceed(); 7 Console.Out.WriteLine("Advice executed; advised method returned " + returnValue); 8 return returnValue; 9 } 10 } 11 12 public interface ICommand 13 { 14 object Execute(object context); 15 } 16 17 public class ServiceCommand : ICommand 18 { 19 public object Execute(object context) 20 { 21 Console.Out.WriteLine("Service implementation : [{0}]", context); 22 return null; 23 } 24 } 25 26 [TestMethod] 27 public void TestMethod1() 28 { 29 ProxyFactory factory = new ProxyFactory(new ServiceCommand()); 30 factory.AddAdvice(new ConsoleLoggingAroundAdvice()); 31 ICommand command = (ICommand)factory.GetProxy(); 32 command.Execute("This is the argument"); 33 //ICommand command = (ICommand)ctx["myServiceObject"]; 34 //command.Execute("This is the argument"); 35 }

Using Pointcuts应用切入点:可以控制为方法级别的粒度,实际中最常用,这儿介绍配置的方式。

<object id="consoleLoggingAroundAdvice"
type="Spring.Aop.Support.RegularExpressionMethodPointcutAdvisor">
<property name="pattern" value="Do"/>
<property name="advice">
<object type="Bjork.BaseService.BL.ConsoleLoggingAroundAdvice"/>
</property>
</object>
<object id="myServiceObject"
type="Spring.Aop.Framework.ProxyFactoryObject">
<property name="target">
<object id="myServiceObjectTarget"
type="Bjork.BaseService.BL.ServiceCommand"/>
</property>
<property name="interceptorNames">
<list>
<value>consoleLoggingAroundAdvice</value>
</list>
</property>
</object>
  • 接下来介绍其他的拦截器

Before advice

IMethodBeforeAdvice

Before(MethodInfo method, object[] args, object target)

After advice

IAfterReturningAdvice

AfterReturning(object returnValue, MethodInfo method, object[] args, object target)

Throws advice

IThrowsAdvice

AfterThrowing(Exception ex)

Around advice

IMethodInterceptor

Invoke(IMethodInvocation invocation)

  • Layering advice层次化建议(组合使用interceptor)
 1 //代码部分
 2 ProxyFactory factory = new ProxyFactory(new ServiceCommand());
 3 factory.AddAdvice(new ConsoleLoggingBeforeAdvice());
 4 factory.AddAdvice(new ConsoleLoggingAfterAdvice());
 5 factory.AddAdvice(new ConsoleLoggingThrowsAdvice());
 6 factory.AddAdvice(new ConsoleLoggingAroundAdvice());
 7 ICommand command = (ICommand) factory.GetProxy();
 8 command.Execute();
 9 
10  //配置部分
11 <object id="throwsAdvice" type="Spring.Examples.AopQuickStart.ConsoleLoggingThrowsAdvice"/>
12 <object id="afterAdvice" type="Spring.Examples.AopQuickStart.ConsoleLoggingAfterAdvice"/>
13 <object id="beforeAdvice" type="Spring.Examples.AopQuickStart.ConsoleLoggingBeforeAdvice"/>
14 <object id="aroundAdvice" type="Spring.Examples.AopQuickStart.ConsoleLoggingAroundAdvice"/>
15 <object id="myServiceObject"
16 type="Spring.Aop.Framework.ProxyFactoryObject">
17 <property name="target">
18 <object id="myServiceObjectTarget"
19 type="Spring.Examples.AopQuickStart.ServiceCommand"/>
20 </property>
21 <property name="interceptorNames">
22 <list>
23 <value>throwsAdvice</value>
24 <value>afterAdvice</value>
25 <value>beforeAdvice</value>
26 <value>aroundAdvice</value>
27 </list>
28 </property>
29 </object>

AOP的使用场景:缓存[Caching],性能监控,重试规则。

这部分内容就到此为止,还有其他事宜,这个暂时就不使用了,确实存在适用性上的问题。不像JAVA Spring一样的整合使用,确实使用性下降很多,比如不是所有的场景都适合使用容器,且会增加系统的复杂程度。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android中高级开发

Android开发之漫漫长途 XI——从I到X的小结

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

1202
来自专栏逸鹏说道

ExecuteReader在执行有输出参数的存储过程时拿不到输出参数

异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 后期会在博客首发更新:http://dnt...

3557
来自专栏c#开发者

在DataGrid中创建一个弹出式Details窗口

在DataGrid中创建一个弹出式Details窗口 这篇文章来自DotNetJunkie的提议。他最初写信要求我们提供一个关于如何创建在DataGrid 中...

3838
来自专栏数据分析

使用Visual Studio 2010 一步一步创建Powershell Module 和 Cmdlet

之前写了一个C# 调用PowerShell方法, 那么怎么反过来操作呢,也就是怎么样用C#写一个powershell命令呢? 现在就用C#写一个超级简单的Mod...

4309
来自专栏码字搬砖

腾讯企业邮发送邮件 java版

背景: 由于spark streaming程序需要保证 1*24 小时,不间断运行的,为了第一时间知道程序是否出错,所以采用了出错发送邮件这一策略,而公司恰...

1792
来自专栏Java与Android技术栈

归纳AOP在Android开发中的几种常见用法

它是一种关注点分离的技术。我们软件开发时经常提一个词叫做“业务逻辑”或者“业务功能”,我们的代码主要就是实现某种特定的业务逻辑。但是我们往往不能专注于业务逻辑,...

1292
来自专栏程序员的SOD蜜

用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记

[本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看]  目录 一、ORM的"三国志"    2 1,PDF.NET诞生历程...

4329
来自专栏程序员互动联盟

android apk 防反编译技术第一篇-加壳技术

做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习。现在...

5748
来自专栏ml

HDUOJ-------2149Public Sale

Public Sale Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

2958
来自专栏人工智能LeadAI

实时Android语音对讲系统架构

本文属于Android局域网内的语音对讲项目(https://github.com/yhthu/intercom)系列,《通过UDP广播实现Android局域网...

1.3K4

扫码关注云+社区

领取腾讯云代金券