接下来我们看一下SpringNetAop层的内容;此层主要是实现一些AOP的代码,以及特性和一个统一调用spring.net的类;记录日志我们使用Log4Net来实现;

1:Aspects 文件夹里存放的几个类分别是Spring.net几种AOP的通知模式;因为本实例主要是要演示异常的调用所以我们调用的是类LoggingThrowsAdvice.cs;有关Log4Net的运用大家可以搜索一下,不是本文的重点;这边有个要注意此处是类库运用Log4net,所以在读取配置文件时要写成@"bin\\Log4Net.config";而配置文件Log4Net.config属性要设置为:始终复制  嵌入的资源;

1:Aspects 文件夹里存放的几个类分别是Spring.net几种AOP的通知模式;因为本实例主要是要演示异常的调用所以我们调用的是类LoggingThrowsAdvice.cs;有关Log4Net的运用大家可以搜索一下,不是本文的重点;这边有个要注意此处是类库运用Log4net,所以在读取配置文件时要写成@"bin\\Log4Net.config";而配置文件Log4Net.config属性要设置为:始终复制  嵌入的资源;

using System.Linq;
using System.Text;
using SpringNetCommon;
using System.Reflection;
using Spring.Aop;
using log4net;
using log4net.Core; [assembly: log4net.Config.XmlConfigurator(ConfigFile = @"bin\\Log4Net.config", Watch = true)]
namespace SpringNetAop.Aspects
{
public class LoggingThrowsAdvice:IThrowsAdvice
{
private ILog logger;
public LoggingThrowsAdvice()
{
logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("Log4Net.config"));
} public void AfterThrowing(Exception ex)
{
logger.Warn(
String.Format("异常的内容为: {0}", ex));
}
}
}

Log4Net.config配置的内容如下:配置实现的功能是每天生成一个记录文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
<log4net>
<appender name="RollingLogRootFileAppender" type="log4net.Appender.RollingFileAppender">
<!--日志的路径-->
<file value=".\Log\WanLog" />
<!--是否覆盖,默认是追加true-->
<appendToFile value="true"/>
<!--文件滚动周期(每日创建新日志文件)-->
<datePattern value="yyyyMMdd&quot;.txt&quot;"/>
<!--设置无限备份=-1 ,最大备份数为1000-->
<maxSizeRollBackups value="1000"/>
<!--名称是否可以更改为false为可以更改-->
<staticLogFileName value="false" />
<!--文件滚动选项Composite表示根据日期和大小来滚动-->
<rollingStyle value="Composite" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss}[%t][%-5p][%c]%m%n%exception%n" />
</layout>
</appender>
<root>
<level value="All" />
<appender-ref ref="RollingLogRootFileAppender" />
</root>
</log4net>
</configuration>

2:Attributes存放的是一个重写的特性;spring.net特性来定位要调用AOP;这边主要注意是要继承Attribute;

using System.Collections.Generic;
using System.Linq;
using System.Text; namespace SpringNetAop.Attributes
{
public class LoggingAttributes:Attribute
{
public LoggingAttributes()
{ }
}
}

3:SpringNetHelp文件夹存放的是一个统一调用spring.net的类;因为我把spring.net的配置文件存放在UI层;所以要注意调用的路径问题;配置文件我们在UI层进行;

using Spring.Core;
using Spring.Context;
using Spring.Context.Support;
using Spring.Core.IO;
using Spring.Objects.Factory;
using Spring.Objects.Factory.Xml;
namespace SpringNetAop.SpringNetHelp
{
public class GetAppContext
{
private static IApplicationContext applicationContext = null; public GetAppContext()
{ } public static IApplicationContext ApplicationContext
{
get
{
applicationContext = new XmlApplicationContext("~/Config/Objects.xml");
return applicationContext;
}
}
}
}

接下来我们看一下逻辑层跟数据层的代码;

首先看一下数据层的代码;我们为要进行异常记录的方法加上特性[LoggingAttributes]

using System.Linq;
using System.Text;
using ISpringNetDAL;
using SpringNetAop.Attributes;
namespace SpringNetDAL
{
public class UserOperateDAL:IUserOperateDAL
{
[LoggingAttributes]
public string UserLogin(string UserName)
{
throw new Exception("我是DAL层的异常");
}
}
}

看BLL层的具体代码如下:

using Spring.Core;
using SpringNetAop;
using Spring.Core.IO;
using Spring.Objects.Factory.Xml;
using Spring.Objects.Factory;
using Spring.Context.Support;
using Spring.Context;
namespace SpringNetBLL
{
public class UserOperate:BaseBLL
{
private IUserOperateDAL _userOperatedal = null; public UserOperate()
{
} [LoggingAttributes]
public override string UserLogin(string UserName)
{
// throw new Exception("我是BLL层异常内容啊");
_userOperatedal = (IUserOperateDAL)SpringNetAop.SpringNetHelp.GetAppContext.ApplicationContext.GetObject("UserOperateDal");
return _userOperatedal.UserLogin(UserName);
}
}
}
<?xml version="1.0"?>
<configuration> <configSections>
<sectionGroup name="spring">
<!--提供Spring对应用程序上下文的支持-->
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<!--提供Spring对 对象容器的支持-->
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
</sectionGroup>
</configSections> <spring>
<context>
<resource uri="file://~/Config/Objects.xml"/>
<!--<resource uri="assembly://SpringNetUI/SpringNetUI.Config/Objects.xml"/>-->
</context>
</spring> </configuration>
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <object name="UserOperateDal" type="SpringNetDAL.UserOperateDAL,SpringNetDAL"/> <!--环绕通知拦截 运用特性-->
<object id="aroundAdvisor" type="Spring.Aop.Support.AttributeMatchMethodPointcutAdvisor, Spring.Aop">
<property name="Advice">
<object type="SpringNetAop.Aspects.LoggingAroundAdvice, SpringNetAop" />
</property>
<property name="Attribute"
value="SpringNetAop.Attributes.LoggingAttributes, SpringNetAop" />
</object> <!--后置通知拦截 运用名称-->
<object id="afterAdvisor" type="Spring.Aop.Support.NameMatchMethodPointcutAdvisor, Spring.Aop">
<property name="Advice">
<object type="SpringNetAop.Aspects.LoggingAfterAdvice, SpringNetAop" />
</property>
<property name="MappedNames">
<list>
<value>*UserLogin</value>
</list>
</property>
</object> <!--异常通知拦截 程序所有都支持 不设置条件-->
<object id="throwsAdvice" type="SpringNetAop.Aspects.LoggingThrowsAdvice, SpringNetAop" /> <object id="myServiceCommand" type="Spring.Aop.Framework.ProxyFactoryObject">
<property name="Target">
<object type="SpringNetBLL.UserOperate, SpringNetBLL" />
</property>
<property name="InterceptorNames">
<list>
<value>aroundAdvisor</value>
<value>afterAdvisor</value>
<value>throwsAdvice</value>
</list>
</property>
</object>
</objects>

spring.net异常处理的更多相关文章

  1. Spring Boot异常处理详解

    在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类 ...

  2. Spring Boot 异常处理

    Spring Boot 异常处理 本节介绍一下 Spring Boot 启动时是如何处理异常的?核心类是 SpringBootExceptionReporter 和 SpringBootExcepti ...

  3. Spring Boot异常处理

    一.默认映射 我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局 ...

  4. Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...

  5. Spring 全局异常处理

    [参考文章]:Spring全局异常处理的三种方式 [参考文章]:Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理 [参考文章]:@ControllerAdvic ...

  6. Spring MVC异常处理SimpleMappingExceptionResolver

    Spring MVC异常处理SimpleMappingExceptionResolver[转] (2012-12-07 13:45:33) 转载▼ 标签: 杂谈 分类: 技术分享 Spring3.0中 ...

  7. Spring统一异常处理

    1.为什么要用Spring的统一异常处理? 项目中无论是controller层.service层还是dao层都会有异常发生.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量 ...

  8. Spring MVC异常处理代码完整实例

    Spring MVC异常处理流程: 提供构造方法传值: 配置异常处理器的bean

  9. 一文带你掌握Spring Web异常处理方式

    一.前言 大家好,我是 去哪里吃鱼 ,也叫小张. 最近从单位离职了,离开了五年多来朝朝夕夕皆灯火辉煌的某网,激情也好悲凉也罢,觥筹场上屡屡物是人非,调转过事业部以为能换种情绪,岂料和下了周五的班的前同 ...

  10. Spring 4 异常处理

    异常与HTTP状态码的映射(@ResponseStatus) Spring默认会将自身抛出的异常自动映射到合适的状态码,如下是一些示例: 举个例子,当后端抛出如下异常(TypeMismatchExce ...

随机推荐

  1. 【BZOJ】【1037】【ZJOI2008】生日聚会party

    DP orz iwtwiioi 这种题居然是DP……原来统计方案数是可以用动态规划来做的啊= =用一些变量来维护一些信息,保证方案可行性/合法性 人太弱实在是有些忧伤…… /************* ...

  2. frequentism-and-bayesianism-chs-iii

    frequentism-and-bayesianism-chs-iii   频率主义 vs 贝叶斯主义 III:置信(Confidence)与可信(Credibility),频率主义与科学,不能混为一 ...

  3. pragma伪指令

    pragma伪指令 通过pragma伪指令告诉编译器如何对待特定的函数.对象或代码段.TMS320C28x C/C++编译器支持如下形式的pragma伪指令: CODE_SECTION(func,“s ...

  4. SQLite中使用时的数据类型注意

    在使用SQLite时,要注意:在SQLite中的Integer类型,对应在C#中需要使用long类型或者Int64 在使用SQLite时,要注意:在SQLite中存放的日期类型必须是如此:yyyy-M ...

  5. CSS自定义文件上传按钮

    今天一同事问我文件上传按钮的问题,情况是这样的,他页面上有3个按钮,分为左中右三个,左边的位按钮甲,右边的位按钮乙,而中间的就是个文件选择按钮,情况大概是这个样子的: 两边的按钮都有了样式,但中间的选 ...

  6. JDK各个版本下载页面

    http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html 需 ...

  7. MVC模式在游戏开发的应用

    原地址: http://www.cocoachina.com/gamedev/2012/1129/5212.html MVC是三个单词的缩写,分别为:模型(Model).视图(View)和控制Cont ...

  8. CodeSite使用小结 转载

    一.要使用Codesite,需要引用csintf单元二.CodeSite的基本方法(一)AddCheckPoint方法codesite.AddCheckPoint 加入监测点(二)AddSeperat ...

  9. 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)

    题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...

  10. 从.NET 1.1 升级到.NET 4.0 遇到 线程间操作无效: 从不是创建控件 [XX] 的线程访问它.

    有两种方式解决 1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;2.使用Invoke等委托函数 问题原因是 .NET2.0 以后拒绝 ...