上篇介绍了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、引入通知,这个还没去了解,有兴趣的同学可以自己百度一下。