Spring.net结合NHibernate的Aop配置说明
看了园子里“刘冬”写的Spring.net跟NHibernate的组合系列的“面向切面编程(Aop)”,结合自己搭建的项目总算是完成了所有的配置,现把配置过程及说明记录一下,算是自己做个笔记,也算给其他人一些参考吧!整个Aop的配置从我个人角度觉得应该分为二部分
1是配置通知(Adivce)的方式,2是配置Aop代理的方式
一、自动代理加环绕通知
ObjectNameAutoProxyCreator(从名字翻译是“对象名称自动代理创建器”),就是自动创建代理对象
<?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net" xmlns:aop="http://www.springframework.net/aop"> <description> AOP拦截器说明:此配置会拦截Spring中所有object标签的id以Service结尾的注入配置项</description> <!--配置AOP通知--> <object id="aroundAdvice" type="Dao.Advice.AroundAdvice,Dao"></object> <object id="ProxyCreator" type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop"> <!--配置要拦截的对象名称--> <property name="ObjectNames"> <!--此处拦截的value对象是配置在Spring中的object对象的id--> <list> <value>*Service</value> </list> </property> <!--配置拦截器的名称--> <property name="InterceptorNames"> <list> <value>aroundAdvice</value> </list> </property> </object> </objects>
拦截器代理对象的方式(ProxyCreator)为”自动代理(Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator)“,即会拦截“Spring配置文件中的id以Service结尾的Object标签”。
拦截的通知方式为环绕通知(AroundAdvice),必须实现IMethodInterceptor接口,环绕通知的类如下
namespace Dao.Advice { /// <summary> /// 环绕通知 /// </summary> public class AroundAdvice : IMethodInterceptor { public object Invoke(IMethodInvocation invocation) { Console.WriteLine("环绕通知开始拦截:" + invocation.TargetType.Name + "." + invocation.Method.Name); object obj = invocation.Proceed(); Console.WriteLine("环绕通知结束拦截:" + invocation.TargetType.Name + "." + invocation.Method.Name); return obj; } } }
环绕通知的Aop配置如上,XML配置为单个xml文件,注意xml文件的“属性”--“生成操作”改为“嵌入的资源”。
二、自动代理加后置通知
后置通知的类如下
namespace Dao.Advice { /// <summary> /// 后置通知 /// </summary> public class AfterAdvice : IAfterReturningAdvice { public void AfterReturning(object returnValue, System.Reflection.MethodInfo method, object[] args, object target) { Console.WriteLine("后置通知开始拦截..."); Console.WriteLine("后置通知方法名:" + method.Name); Console.WriteLine("目标类:" + target); Console.WriteLine("参数如下:"); if (args != null) { foreach (var arg in args) { Console.WriteLine(arg); } } Console.WriteLine("返回值:" + returnValue); Console.WriteLine("后置通知结束拦截..."); } } }
在如下的节点中“<list>”节点中增加“<value>afterAdvisor</value>”,xml内容如下
<!--筛选要拦截的方法--> <object id="afterAdvisor" type="Spring.Aop.Support.NameMatchMethodPointcutAdvisor, Spring.Aop"> <!--指定筛选方法的拦截器--> <property name="Advice"> <object type="Dao.Advice.AfterAdvice,Dao"></object> </property> <!--对方法进行筛选--> <property name="MappedNames "> <list> <value>*NameValue</value> </list> </property> </object>
即可实现后置拦截通知,且此通知是通过匹配方法名做为切入点