- 浏览: 77242 次
文章分类
- 全部博客 (48)
- AOP (0)
- ASP.NET (1)
- C# (0)
- Community Server (0)
- Database (0)
- Design Pattern (3)
- JAVA (1)
- JavaScript (1)
- Linux (1)
- O/R Mapping (0)
- OO (3)
- SQL Server (1)
- VB.NET (0)
- Visual Studio 2005 (2)
- Windows (2)
- WPF (0)
- XML/XSLT (0)
- 常用工具类 (0)
- 人生感悟 (0)
- 算法 (0)
- 转载 (5)
- [网站分类]1.首页原创精华.NET区(包含架构设计、设计模式)(对首页文章的要求:原创、高质量、经过认真思考并精心写作) (3)
- [网站分类]2..NET新手区(用于发表不合适发表在首页的.NET技术文章,包括小经验、小技巧) (15)
- [网站分类]3.非技术区(技术之外的文章,但不要涉及任何政治内容) (2)
- [网站分类]4.其他技术区 (4)
- [网站分类]5.企业信息化 (0)
- [网站分类]6.读书心得区(技术书籍阅读心得、书籍推荐) (0)
- [网站分类]7.提问区(.NET技术方面的提问) (0)
- [网站分类]8.技术转载区(.NET技术文章转载, 请注明原文出处) (1)
- [网站分类]9.求职招聘区(个人求职、企业招聘) (0)
- [网站分类]Dottext区 (0)
- [网站分类]GIS技术 (0)
- [网站分类]IT英才专区(IT职场交流) (0)
- [网站分类]SharePoint (0)
- [网站分类]博客园.NET俱乐部(俱乐部组织与活动方面的文章) (0)
- [网站分类]软件发布区(发布自己开发的代码、软件) (0)
- [网站分类]网站管理区(网站管理方面的疑问、建议、意见, 寻求管理员帮助) (0)
- [网站分类]业界新闻 (0)
最新评论
-
xjw1987524:
这个问题我是弄啦很久,我也试过反编译,不知道为什么就是不成功; ...
支持中文参数的 jspSmartUpload
Spring.Net AOP 学习之旅: 使用 Throws Advice 处理异常
写在前头:本文示例和部分文字来自《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 接口:
namespace TestThrowAdvice
{
public interface IHello
{
void Hello(string name);
}
}
接着定义一个 HelloSpeaker 类来实现 IHello 接口,并在 Hello() 方法中模拟程序发生错误时的异常抛出:
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 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 在异常发生时提供记录服务:
<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 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
发表评论
-
获取某目录下的所有文件(包括子目录下文件)的数量(C#)
2005-11-04 17:27 3973以前写过一个通过计算目录遍历所有文件和子目录的方法来获得某目录 ... -
Visual Studio 2005 试用笔记
2005-11-06 21:36 911今天开始用上了 VS 2005 ... -
C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 笔记
2005-11-09 22:52 1299(很喜欢李建忠老师的这个讲座,可惜暂时没更多的了,继续关注 M ... -
利用视图管理器高效编写 SQL SELECT 语句
2006-02-19 13:27 921献给初学者,老鸟别扔砖头 编写 ... -
将Web站点下的绝对路径转换为虚拟路径
2006-05-07 12:48 1179很经常使用到的一个功能,但在在网上却一直没有找到相关的解决方法 ... -
比较高效地实现从两个不同数组中提取相同部分组成新的数组(只支持Int类型) [C#]
2006-05-13 22:17 4018有时候我们需要从两个不同数组中提取出相同的部分 ... -
基于 .NET 2.0 System.Net.Mail namespace 的邮件发送组件
2006-05-17 13:11 1863一个基于 .NET 2.0 System.Net.Mail n ... -
从 CCS 1.1 升级到 CS 2.0 所遇到的问题和部分解决方法
2006-06-16 12:58 799整理了一下,记录在这 ... -
.NET Enum The Next Level
2006-08-20 17:15 1147声明:本文内容出自:http://www.codeprojec ... -
C# 中实现随机时间的获取
2006-09-07 17:31 1321原理其实非常简单,取出两个时间差的秒数,再在0到该秒数 ... -
NHibernate 实体类中重写 Equals() 和 GetHashCode()
2006-09-17 17:08 1526在正常的对象操作中,当两个对象都是通过 new ... -
初识 db4o
2006-10-25 21:41 920今天早上收到 IBM developerWork ... -
.NET 1.1 下不使用 System.Web.Mail.SmtpMail 发送邮件的其它选择
2006-12-22 20:35 1221最近工作原因需要维护 ASP.NET 1.1 的程 ... -
.NET 中的 委托与事件
2006-12-27 10:10 1908一、什么是委托 ...
相关推荐
在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...
}/**//异常通知@AfterThrowing(pointcut="interceptorMethod()", throwing="ex")public void doThrowing(Exception ex){System.out.println("This is Throwing Advice\t"+ex.getMessage());} *//* 定义环绕通知,...
Spring AOP,即Aspect-Oriented Programming(面向切面编程),是Spring框架的重要特性,它为应用程序提供了声明式的企业级服务,如日志、事务管理等。本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁...
这里的“标签加载通知”指的是在Spring AOP中,如何通过使用特定的注解来配置和执行通知(advice)。下面将详细介绍这一概念。 首先,我们需要了解Spring AOP中的通知类型: 1. 前置通知(Before Advice):在目标...
在Spring AOP(面向切面编程)中,自定义切面是实现业务逻辑解耦、增强代码可维护性的重要手段。AspectJ是一个强大的面向切面的编程库,它提供了与Spring AOP集成的能力,使我们可以编写更为灵活和模块化的代码。...
Spring AOP支持四种类型的Advice:Before Advice、After Advice、Around Advice、Throw Advice。 Before Advice顾名思义,在目标对象的方法执行之前被调用。开发者可以通过实现org.springframework.aop....
Spring框架是Java开发中的核心组件,它以依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)为核心,极大地简化了企业级应用的开发工作。在这个“spring练习AOP与IOC...
3. 抛出通知(Throws Advice):仅当方法调用抛出一个异常时才被调用。 4. 后置通知(After Returning Advice):在连接点处的方法调用已经完成,并且已经返回一个值时运行。 5. 引入通知(Introduction Advice):...
在 Spring AOP 中,还有其他类型的 Advice,例如 Before Advice、After Advice、Throws Advice 等,每种 Advice 都有其特定的用途和应用场景。 在实际应用中,Spring AOP 可以应用于各种场景,例如日志记录、安全...
在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...
Spring AOP和IOC是Spring框架的核心特性,它们极大地简化了企业级Java应用的开发。AOP(面向切面编程)允许我们分离关注点,将横切关注点(如日志、事务管理)从核心业务逻辑中解耦出来。而IOC(控制反转)则是...
在Spring AOP中,我们可以定义“通知”(advice)来执行特定的操作,这些通知可以被应用到目标对象的方法执行的不同阶段。接下来,我们将详细探讨四种主要的通知类型,以及如何在Spring AOP中使用它们。 1. **...
它们可以通过实现`org.springframework.aop.AfterReturningAdvice`和`org.springframework.aop.ThrowsAdvice`接口来创建,或者使用`@AfterReturning`和`@AfterThrowing`注解。 ```java @Aspect public class ...
Spring AOP实现详解 在Java开发中,Spring框架以其强大的功能和灵活性被广泛采用,而AOP(面向切面编程)是Spring框架的一个重要组成部分。AOP允许开发者将关注点从核心业务逻辑中分离出来,比如日志记录、权限检查...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许我们在不修改原有代码的情况下,插入额外的功能,如日志、事务管理等。本文将深入探讨Spring AOP的概念及其源码实现,帮助读者理解其内部机制。 一、...
SSH-AOP笔记主要涵盖的是Spring、Struts和Hibernate三大框架集成使用时,如何结合Aspect Oriented Programming(面向切面编程)的理念进行应用增强。在Java企业级开发中,SSH是常用的MVC架构,而AOP则是一种编程范式...
Spring AOP是Spring框架的重要组成部分,它允许开发者在不修改原有代码的情况下,插入额外的功能。 在Spring AOP中,以下几个核心概念至关重要: 1. **方面(Aspect)**:方面是关注点的模块化,比如事务管理就是...
使用Spring AOP的好处在于,它允许开发者以声明式的方式处理横切关注点,减少了代码的重复和混乱,提升了代码的可读性和可维护性。同时,由于Spring AOP是基于动态代理实现的,因此不需要预编译或特殊语言支持,对...
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许我们在不修改源代码的情况下,对程序的行为进行增强或监控。日志拦截是AOP应用的一个常见场景,通常用于记录方法的调用信息,如入参、执行时间、返回...
在IT行业中,Spring AOP(面向切面编程)是一个强大的工具,它允许我们在不修改源代码的情况下,对程序的行为进行增强或监控。本篇将详细阐述Spring AOP在记录用户操作日志方面的重要应用,以及如何利用@Aspect注解...