Spring.NET AOP初体验和实践

  最近有一个任务是往现有系统中添加记录操作日志的功能,原本打算是在ORM框架中对增删改的委托里添加新的事件来记录,但是这样做的后果是改变了原有操作逻辑并且增加了系统响应请求的等待时间,后来打算采用Spring.Net AOP的框架来对现有操作方法进行拦截,这样的话就可以在不改变原有逻辑的前提下,记录操作日志,并且依靠Spring.Net AOP现成的DI方式,灵活添加拦截面,话不多说,下面是我个人的研究心得,在此记录一下。

  关于Spring.Net AOP的基础概念,大家就自行百度下,我这里不多详述。这里给个链接,我觉得这位大神冬子哥讲的很好理解。https://www.cnblogs.com/GoodHelper/archive/2009/11/12/SpringNet_Aop.html

郑重声明:感兴趣的同学可以先看刘东的博客,我也是在此基础上学习之后有了自己的理解才写这篇随笔的,目的是加深理解和讨论交流。此随笔里一些代码也是看着这位大神博客CV大法过来的,哈哈!

  AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。对于Spring.net AOP来讲,这点我自己的理解就是我们可以使用Spring来拦截处理业务逻辑的方法对象,有点像MVC的拦截器。

 

 

   

这里有两种方式来实现AOP:

一种是自动代理模式,采用DI的方式注入服务,优点是使用比较方便,改动配置文件就行,缺点是写配置有些懵,但是搞懂了也没啥

另一种是官档或者Spring+开发手册上的ProxyFactory方法,即代理模式。

 

先说第一种方法,自动代理模式。

   想实现IOC,我们需要一个容器来装载注入的服务,Spring.Net提供了一种在标准.net应用配置文件里添加自定义的Configuration Section方式来获取一个上下文。首先要在配置文件里添加如下配置:

 

 

 如上,把必须的节点配置加上去之后,现在往objects节点里添加具体内容。

 

 

 这里注入了一个自动代理,并往自动代理对象里添加了Advisor,同时注入了这个Advisor,这里有两个pointcut,具体就是筛选拦截类名中含有'Service'的类的所有方法。

 

 

 以上完成了结构图里说的配置步骤。

接下来就是在代码中获取这个容器

 

 

 ContextRegistry.GetContext()方法获取context对象之前,Spring已经按照配置创建并注册好了context对象。创建Context实例是由ContextHandler对象里的Create()方法,在创建过程中又调用了ContextRegistry类里的 RegisterContext()方法。

 

 

 

 

 

第二种方法呢,是通过代码实现的,额···声明对代理工厂,然后往工厂里添加各种Advisor,然后获取代理,执行!这个较不推荐使用哈,太不方便了!

 

 

到这里,初体验Spring.NET AOP也告一段落了,研究到这里,我已可以运用到我的工作中了,之后等看看完Spring Air之后再总结如何运用到Web项目里。

posted @ 2021-05-08 19:49  君陌和棒棒糖  阅读(177)  评论(0编辑  收藏  举报