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>

  即可实现后置拦截通知,且此通知是通过匹配方法名做为切入点

 

 

 

  

posted @ 2021-07-16 10:37  doson  阅读(104)  评论(0编辑  收藏  举报