对Spring.Net的AOP一些思考及应用
我们无法通过抽象父类消除上面说的 重复性代码,因为这些代码依附在业务逻辑中了。AOP独辟蹊径,不通过纵向架构,而是横向的看代码,把这些横向的逻辑代码抽取出来,做成一个独立的模块。
参考
SimpleCompanyManager 这个类依赖了
SecurityManager,发生了业务性的耦合。我们用代理模式来实现看看会发生什么。
SecurityManager耦合,相当于是加了一层,但这样实现起来比较麻烦这样,
public class AroundAdvice : IMethodInterceptor
MethodInterceptor这个接口(JDK的动态代理接口为
InvocationHandler,在
java.lang.reflect这个包里面)。.NET里的spring只是少了一个I!如此看来语言是相通的,特别对于统一框架而言:D。 (
其实实际的项目经常用的是@Aspectj注解,支持正则表达式,用起来更加方便)
CGLIB是一个强大的高性能的
代码生成
包。它广泛的被许多AOP的
框架
使用,例如Spring AOP和dynaop,为他们提供方法的interception(拦截)。
ProxyFactory,然后加入
Advice(通知,感觉叫增强更合适),最后使用
GetProxy获取代理,执行方法。
AOP的通知类型
AOP代理,比如当需要代理某个服务层的所有对象时,这种方法就会使配置文件变的相当庞大。为简化配置过程,Spring.NET提供了“
自动代理”的功能,可以根据条件自动创建
代理对象,也就是说,可以将多个对象分组以作为要代理的候选对象。
自动代理使用起来比较简单和方便.
<property name="ObjectNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="InterceptorNames">
<list>
<value>aroundAdvice</value>
</list>
</property>
</object>
<object id="aroundAdvice" type="Common.AroundAdvice, Common"/>
<object id="categoryService" type="Service.ProductService, Service"/>
<object id="productService" type="Service.ProductService, Service"/>
<property name="ObjectNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="InterceptorNames">
<list>
<value>aroundAdvisor</value>
</list>
</property>
</object>
<object id="aroundAdvisor" type="Spring.Aop.Support.NameMatchMethodPointcutAdvisor, Spring.Aop">
<property name="Advice" ref="aroundAdvice"/>
<property name="MappedNames">
<list>
<value>Find*</value>
</list>
</property>
</object>
<
objec
t id="aroundAdvice" type="Common.AroundAdvice, Common"/>
<property name="advice" ref="aroundAdvice"/>
<property name="patterns">
<list>
<value>.*Find*.*</value>
</list>
</property>
</object>
<!--
必须让Spring.NET容器管理DefaultAdvisorAutoProxyCreator类
-->
<object id="ProxyCreator" type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop"/>
<object id="aroundAdvice" type="Common.AroundAdvice, Common"/>
<object id="categoryService" type="Service.ProductService, Service"/>
<object id="productService" type="Service.ProductService, Service"/>
以上配置相对复杂一点。使用SdkRegularExpressionMethodPointcut的配置就相对简单的多,而项目中SdkRegularExpressionMethodPointcut也经常用到。
SdkRegularExpressionMethodPointcut只需要简单的配置一下通知和切入点就完成了。
<object id="advisor" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
<property name="pattern" value="Service.*"/>
</object> <aop:config>
<aop:advisor pointcut-ref="advisor" advice-ref="aroundAdvice"/>
</aop:config> <object id="aroundAdvice" type="Common.AroundAdvice, Common"/> <object id="categoryService" type="Service.ProductService, Service"/>
<object id="productService" type="Service.ProductService, Service"/>
是不是和JAVA的Spring XML配置完全一样?:D
3.属性切入点
public
class ConsoleDebugAttribute : Attribute { } public
class AttributeService : IService { [ConsoleDebug] public IList FindAll() { return
new ArrayList(); } public
void Save(object entity) { Console.WriteLine("保存:"
+ entity); } }
JAVA版的是注解,下面是配置文件
<object id="aroundAdvisor" type="Spring.Aop.Support.AttributeMatchMethodPointcutAdvisor, Spring.Aop">
<property name="Advice" ref="aroundAdvice"/>
<property name="Attribute"
value="ConfigAttribute.Attributes.ConsoleDebugAttribute, ConfigAttribute" />
</object> <object id="proxyFactoryObject" type="Spring.Aop.Framework.ProxyFactoryObject">
<property name="Target">
<object type="ConfigAttribute.Service.AttributeService, ConfigAttribute" />
</property>
<property name="InterceptorNames">
<list>
<value>aroundAdvisor</value>
</list>
</property>
</object> <object id="aroundAdvice" type="Common.AroundAdvice, Common"/>
完
以上所有源码下载
对Spring.Net的AOP一些思考及应用的更多相关文章
- 【转】spring - ioc和aop
[转]spring - ioc和aop 1.程序中为什么会用到spring的ioc和aop 2.什么是IOC,AOP,以及使用它们的好处,即详细回答了第一个问题 3.原理 关于1: a:我们平常使用对 ...
- Spring中的AOP
什么是AOP? (以下内容来自百度百科) 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...
- 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(连接点):程序执行 ...
- Spring MVC 线程安全问题的思考
Spring MVC 线程安全问题的思考 在读一些博文的时候发现有些文章对SpringMVC的Controller线程安全的验证并不正确,比如没有探究controller线程不安全的具体原因,比如将请 ...
- springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题
解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640 ...
- Spring核心框架 - AOP的原理及源码解析
一.AOP的体系结构 如下图所示:(引自AOP联盟) 层次3语言和开发环境:基础是指待增加对象或者目标对象:切面通常包括对于基础的增加应用:配置是指AOP体系中提供的配置环境或者编织配置,通过该配置A ...
- Spring IOC及AOP学习总结
一.Spring IOC体系学习总结: Spring中有两个容器体系,一类是BeanFactory.还有一类是ApplicationContext.BeanFactory提供了基础的容器功能.Appl ...
随机推荐
- [Swift系列]002-基础语法
基础语法就那老几样,很快可以说完 [常量.变量] 1.变量用 var,系统自动去判断类型,但变量再次赋值需保持数据类型一致 var a=50 相信用过js/java/C#的,对这个var都不陌生 使 ...
- [ ] 字符组(Character Classes) (转)
[]能够匹配所包含的一系列字符中的任意一个.需要注意的是,[]虽然能匹配其中的任意一个字符,但匹配的结果只能是一个字符,不是多个. 例如[abc]表示字符“a”或“b”或“c”. []支持用连字符“- ...
- Maven的功用所引发的哲学思想
我们知道Maven有三个仓库 本地仓库 ~/.m2/repository/ 每一个用户也可以拥有一个本地仓库 远程仓库 中央仓库:Maven默认的远程仓库 http://repo1.maven.org ...
- 递归神经网络(Recurrent Neural Networks,RNN)
在深度学习领域,传统的多层感知机(MLP)具有出色的表现,取得了许多成功,它曾在许多不同的任务上——包括手写数字识别和目标分类上创造了记录.甚至到了今天,MLP在解决分类任务上始终都比其他方法要略胜一 ...
- Servlet容器的启动(Tomcat为例)
一.容器简介 在tomcat容器等级中,context容器直接管理servlet在容器中的包装类Wrapper,所以Context容器如何运行将直接影响servlet的工作方式. tomcat容器模型 ...
- 【转】session setup failed: NT_STATUS_LOGON_FAILURE -- 不错
原文网址:http://blog.sina.com.cn/s/blog_5cdb72780100l26f.html samba服务器出现“session setup failed: NT_STATUS ...
- Android AIDL SERVICE 双向通信 详解
http://www.cnblogs.com/punkisnotdead/p/5062631.html 起因 是这个blog 提到了 用webview 的时候 用开启子进程的方式 可以极大避免内存泄露 ...
- C# winform 自定义控件
近来因为项目的问题,开始研究winform自定义控件,这篇主要是将自定义控件的属性在属性编辑器中可编辑,如果你对自定义控件比较了解的,就不用继续往下看了 首先,我创建了一个类UserButton,继承 ...
- org.hibernate.MappingException: duplicate import异常
在开发hibernate时,一起多谢ORM类和映射文件时,报出:org.hibernate.MappingException: duplicate import com.XXX异常 解决方案: 检查你 ...
- Delphi MDI程序 父窗体如何调用当前活动子窗体的函数/过程
一个MDI文本文件编辑器打开了N个子窗体子窗体的.pas文件有一些public的过程和函数我想在父窗体调用当前活动的子窗体函数我用Self.ActiveChildForm无法调用直接frmEdit.x ...