`
yyw84
  • 浏览: 77982 次
社区版块
存档分类
最新评论
阅读更多


         写在前头:本文示例和部分文字来自《Spring 技术手册》,我所做的就是将其 JAVA 代码翻译成 C#,以此来巩固学习成果,版权归原作者所有。如有侵犯您版权,请告之,本人将马上删除。
      
         通常我们对于异常的处理方式都是大同小异的,要么直接捕获并处理,要么让它抛向上一层,要么就是记录到日志里,或者发邮件提供管理员,但这样下来一个项目中便会到处充斥着 try/catch ,并且 catch 中的代码基本类似,于是我们闻到的其中难闻的坏味道。

         本文将介绍如何通过 Spring.Net 的 AOP 特性实现异常的统一处理,如果我们需要在异常发生时做一些操作的话我们就必须实现 Spring.Aop.IThrowsAdvice,该接口没有任何实现方法,是一个空接口,它仅仅做为一个标记接口而存在,但实现了 IThrowsAdvice 接口的类必须定义至少一个 AfterThrowing 方法,方法的签名如下:

         AfterThrowing([MethodInfo method, Object[] args, Object target], Exception subclass);

         其中中括号括起来的前三个参数是可选的,返回值可以是任意数据类型。Spring.Aop.Framework.Adapter.ThrowsAdviceInterceptor 类实现对实现了 Spring.Aop.IThrowsAdvice 派生类中的方法依赖注入,其中的 ThrowsAdviceInterceptor() 方法检查 Spring.Aop.IThrowsAdvice 的派生类是否定义了至少一个异常处理方法,如果没有则抛出 ArgumentException 异常,MapAllExceptionHandlingMethods() 方法则在定义好的重载方法中查找出异常类型与最后一个参数所定义的类型中最接近的方法,而且我们不应该在其中实现了两个相同异常类型的方法,即使他们的参数数目不同,否则也将抛出 ArgumentException 异常。

         [下面引用自《Spring 技术手册》第4章 P94 页中的一段话]
         注意到当异常发生时, Throw Advice 的任务只是执行对应的方法,您并不能在 Throw Advice 中将异常处理掉,在 Throw Advice 执行完毕后,原告的异常仍将传播至应用程序之中, Throw Advice 并不介入应用程序的异常处理,异常处理仍旧是应用程序本身所要负责的,如果想要在 Throw Advice 处理时中止应用程序的处理流程,作法是抛出其它的异常。

         接下来看个 Throws Advice 的实际例子,首先定义 IHello 接口:

using System;

namespace TestThrowAdvice
{
    
public interface IHello
    
{
        
void Hello(string name);
    }

}

         接着定义一个 HelloSpeaker 类来实现 IHello 接口,并在 Hello() 方法中模拟程序发生错误时的异常抛出:

using System;

namespace TestThrowAdvice
{
    
public class HelloSpeaker : IHello
    
{
        
public void Hello(string name)
        
{
            Console.WriteLine(
"Hello, " + name);
            
//抱歉! 程序错误! 发生异常 XD
            throw new Exception("发生异常");
        }

    }

}




         如果您需要在应用程序抛出异常时,介入 Throw Advice 提供一些服务,例如记录一些异常信息,则可以实现 Spring.Aop.IThrowsAdvice 接口,在这个例子中我使用了 log4net 组件来实现日志的记录:

using System;
using Spring.Aop;
using log4net;
using log4net.Core;
using System.Reflection;

[assembly: log4net.Config.XmlConfigurator(Watch 
= true)]
namespace TestThrowAdvice
{
    
public class SomeThrowAdvice : IThrowsAdvice
    
{
        
private ILog logger;

        
public SomeThrowAdvice()
        
{
            logger 
= LogManager.GetLogger(this.GetType());
        }


        
public void AfterThrowing(MethodInfo method, Object[] args, Object target, Exception exception)
        
{
            
// 记录异常
            logger.Info("记录异常", exception);
        }

    }

}

 
        接着在配置文件(我这里使用了独立配置文件)中写下以下的定义,让 Throw Advice 在异常发生时提供记录服务:

<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation
="http://www.springframework.net 
         http://www.springframework.net/xsd/spring-objects.xsd"
>

  
<object id="SomeThrowAdvice" type="TestThrowAdvice.SomeThrowAdvice, TestThrowAdvice" />
  
<object id="HelloSpeaker" type="TestThrowAdvice.HelloSpeaker, TestThrowAdvice" />

  
<object id="HelloProxy" type="Spring.Aop.Framework.ProxyFactoryObject, Spring.Aop" >
    
<property name="ProxyInterfaces">
      
<list>
        
<value>TestThrowAdvice.IHello,TestThrowAdvice</value>
      
</list>
    
</property>
    
<property name="Target">
      
<ref object="HelloSpeaker" />
    
</property>
    
<property name="InterceptorNames">
      
<list>
        
<value>SomeThrowAdvice</value>
      
</list>
    
</property>
  
</object>
  
</objects>

 
        最后剩下我们的程序入口 Main() 函数了:

using System;
using Spring.Context;
using Spring.Context.Support;

namespace TestThrowAdvice
{
    
public class Program
    
{
        
static void Main(string[] args)
        
{
            log4net.Config.XmlConfigurator.Configure(); 
            IApplicationContext context 
= new XmlApplicationContext(@"../../SpringNet.xml");
            IHello helloProxy 
= (IHello)context.GetObject("HelloProxy");

            
try
            
{
                helloProxy.Hello(
"Justin");
            }

            
catch (Exception ex)
            
{
                
// 应用程序的异常处理
                Console.WriteLine(ex.Message);
            }

        }

    }

}

 
        程序执行结果输出:
         Hello, Justin
         发生异常...

         日志记录中的结果:
         2006-10-30 20:59:03,125 [4020] INFO  TestThrowAdvice.SomeThrowAdvice - 记录异常
         System.Exception: 发生异常...
            在 TestThrowAdvice.HelloSpeaker.Hello(String name) 位置 E:\..\..\SpringNetDemo\TestThrowAdvice\HelloSpeaker.cs:行号 14
            在 Spring.Objects.ObjectUtils.InvokeMethod(MethodInfo method, Object instance, Object[] arguments) 位置     c:\projects\daily\Spring.Net\src\Spring\Spring.Core\Objects\ObjectUtils.cs:行号 489
   在 Spring.Aop.Framework.ReflectiveMethodInvocation.InvokeJoinpoint() 。。。。。

         示例下载

         嘿嘿,酷毙了,是吧 :P



分享到:
评论

相关推荐

    Spring之AOP介绍

    ### Spring之AOP介绍 #### 一、AOP概述 面向方面编程(Aspect-Oriented Programming,简称AOP)作为一种编程范式,旨在通过模块化的方式处理横切关注点(Cross-cutting Concerns)。传统的面向对象编程(OOP)虽然...

    spring之AOP(动态代理)

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...

    spring_aop

    项目“maven-spring-aop”可能包含了使用Maven构建的Spring AOP示例项目,其中包含了完整的XML配置、Java类和测试用例,便于开发者深入理解和实践Spring AOP的使用。通过这个项目,你可以亲自动手创建、运行并观察...

    基于注解配置和使用spring AOP(spring mvc框架)

    在Spring MVC中,AOP常用于处理全局异常、事务管理和安全控制。例如,你可以创建一个异常处理切面,捕获所有控制器方法抛出的异常并统一处理: ```java @Aspect public class ExceptionHandlingAspect { @...

    spring对AOP的支持(使用Spring的配置文件来演示)

    Spring框架是Java领域中极为重要的一个组件,它为开发者提供了许多便利,其中之一就是对面向切面编程(Aspect Oriented Programming,简称AOP)的支持。AOP允许我们分离关注点,将横切关注点(如日志、事务管理等)...

    使用Spring的注解方式实现AOP的细节

    在Spring框架中,面向切面编程(AOP)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限控制等,这些关注点可以被模块化并独立于业务逻辑进行处理。本篇文章将深入探讨如何通过Spring的注解...

    Spring_AOP开发

    }/**//异常通知@AfterThrowing(pointcut="interceptorMethod()", throwing="ex")public void doThrowing(Exception ex){System.out.println("This is Throwing Advice\t"+ex.getMessage());} *//* 定义环绕通知,...

    spring-aop.rar_aop1270_spring_spring aop

    Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP的源码分析,探讨其核心概念、工作原理以及在...

    Spring Aop的简单实现

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了声明式的企业级服务,如...通过对该项目的深入学习,你将能够更好地理解和掌握Spring AOP的实战应用。

    spring - aop.zip

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,通过插入额外行为来扩展对象的功能的方法。在Java应用程序中,AOP主要用于日志记录、性能度量、安全控制等跨切面的...

    spring注解aop配置详解

    Spring AOP,即Aspect-Oriented Programming(面向切面编程),是Spring框架的重要特性,它为应用程序提供了声明式的企业级服务,如日志、事务管理等。本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁...

    Spring  AOP实现方法大全

    4. **Throw Advice**:在方法抛出异常后调用,但不包括在方法内部捕获并处理的异常。Spring提供了`.ThrowsAdvice`接口来实现此类Advice。 随着Spring的发展,除了使用XML配置,还引入了基于注解的AOP,使得配置更加...

    Spring Mvc AOP通过注解方式拦截controller等实现日志管理

    AOP是Spring框架的核心组件之一,它允许程序员定义“切面”,这些切面可以包含业务逻辑之外的横切关注点,如日志、事务管理、安全性等。AOP通过两种主要的方式实现:代理模式(Proxy)和织入(Weaving)。在Spring中...

    Spring AOP - Advice

    **Spring AOP - Advice** Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了在不修改源代码的情况下,对程序进行功能增强的一种机制。Advice是AOP中的核心概念,代表了在特定连接点(Join Point)...

    spring boot aop 统一处理日志

    在Spring Boot应用中,AOP(面向切面编程)是一种强大的工具,用于实现代码的解耦和模块化,尤其适用于处理横切关注点,如日志记录、事务管理、安全控制等。本教程将深入探讨如何利用Spring Boot的AOP特性来实现日志...

    Spring3.0.5扩展支持AOP获取HttpServletResponse

    在Spring 3.0.5中,为了在AOP中使用`HttpServletResponse`,你需要创建一个切面,该切面包含一个通知,该通知可以访问并操作`HttpServletResponse`。通常,你会在切面中定义一个环绕通知(Around Advice),因为它...

    spring中AOP中标签加载通知

    这里的“标签加载通知”指的是在Spring AOP中,如何通过使用特定的注解来配置和执行通知(advice)。下面将详细介绍这一概念。 首先,我们需要了解Spring AOP中的通知类型: 1. 前置通知(Before Advice):在目标...

    spring aop API示例

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现代码的横切关注点,如日志记录、事务管理、性能监控等。在这个"spring aop API示例"中,我们将深入探讨如何利用Spring AOP的四...

    Spring aop 性能监控器

    对于源码学习,可以查看Spring AOP的实现,尤其是`org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator`和`org.springframework.aop.aspectj.AspectJExpressionPointcut`这两个类,...

Global site tag (gtag.js) - Google Analytics