spring.net AOP通知类型

时间:2021-08-05 15:48:36

  上篇介绍了spring.net AOP的基本实现,其中有说到通知类型,首先在这里补充解释一下。最后出一个异常通知的实例,因为他的实现和别的通知有些不一样。

  1、拦截环绕通知:在Spring中最基础的通知类型。

  public class LogAdvice : IMethodInterceptor
    {
        private void Log()
        {
            Console.WriteLine("保存数据记日志");
        }

        public object Invoke(IMethodInvocation invocation)
        {
            //Log();
            object obj = invocation.Proceed();
            Log();
            return obj;
        }
    }

  2、前置通知,可以用拦截环绕通知代替,效果相当于在拦截环绕通知中,将Log()放在object obj = invocation.Proceed()前面。

    public class LogAdvice : IAfterReturningAdvice
    {
        private void Log()
        {
            Console.WriteLine("保存数据记日志");
        }

        public void AfterReturning(object returnValue, System.Reflection.MethodInfo method, object[] args, object target)
        {
            Log();
        }
    }

  3、后置通知,可以用拦截环绕通知代替,效果相当于在拦截环绕通知中,将Log()放在object obj = invocation.Proceed()后面。

    public class LogAdvice : IMethodBeforeAdvice
    {
        private void Log()
        {
            Console.WriteLine("保存数据记日志2");
        }

        public void Before(System.Reflection.MethodInfo method, object[] args, object target)
        {
            Log();
        }
    }

  4、异常通知:如果连接点抛出异常,异常通知(throws advice)将在连接点返回后被调用。需要继承接口IThrowsAdvice,这个接口不包含任何方法,但是我们必须要实现afterThrowing方法。

  afterThrowing(Method m, Object[] args, Object target, ServletException ex)

  只有最后一个参数是必须的。根据异常通知方法对方法及参数的需求,方法的签名可以有一个或者四个参数。

    public class Advice : IThrowsAdvice
    {
        public Advice() { }

        public void AfterThrowing(Exception exception)
        {
            Console.Error.WriteLine("记录错误日志:" + exception.Message);
            Console.WriteLine();
        }
    }

  异常通知并不会直接处理异常,所以我们需要自己来捕获异常,并处理。

  class Program
    {
        static void Main(string[] args)
        {
            IApplicationContext context = new XmlApplicationContext(@"XMLFile1.xml");
            IDataService service = (IDataService)context.GetObject("DataService");
            try
            {
                service.SaveData();
            }
            catch
            {
                //dosomething
            }
            Console.Read();
        }
    }                    

  异常通知不同的地方在于,接口中没有任何方法,必须根据异常通知方法来自己实现,另外别忘了处理掉异常。

  5、引入通知,这个还没去了解,有兴趣的同学可以自己百度一下。