拦截所有经过IOC的方法

/// <summary>
/// 此类作用:拦截所有经过IOC的方法,日志在Debug模式下记录传入参数,以及产生的错误
/// 日志在Release模式下,只有出错的情况下才会记录传入参数和错误信息
/// </summary>
public class ExceptionLogBehavior : IInterceptionBehavior
{
/// <summary>
/// 日志 Created by ZhangQc 2016.08.17
/// </summary>
private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

/// <summary>
/// 获取当前行为需要拦截的对象类型接口。 Created by ZhangQc 2016.08.17
/// </summary>
/// <returns>所有需要拦截的对象类型接口。</returns>
public IEnumerable<Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
}

/// <summary>
/// 通过实现此方法来拦截调用并执行所需的拦截行为。 Created by ZhangQc 2016.08.17
/// </summary>
/// <param name="input">调用拦截目标时的输入信息。</param>
/// <param name="getNext">通过行为链来获取下一个拦截行为的委托。</param>
/// <returns>从拦截目标获得的返回信息。</returns>
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
//拦截前
IMethodReturn retvalue = getNext()(input, getNext);

#region 参数部分
#if DEBUG
//如果出现异常,会记录参数
for (int i = 0; i < input.Arguments.Count; i++)
{
var parameter = input.Arguments[i];
Log.DebugFormat("第{0}个参数值为:{1}", i + 1, parameter);
}
#endif
#endregion

#region 异常处理部分

if (retvalue.Exception == null)
{
}
else
{
#if !DEBUG
//如果出现异常,会记录参数
for (int i = 0; i < input.Arguments.Count; i++)
{
var parameter = input.Arguments[i];
Log.DebugFormat("第{0}个参数值为:{1}", i + 1, parameter);
}
#endif
Log.ErrorFormat("方法名称:{0},执行出错:{1}", getNext.Method.Name, retvalue.Exception);
//retvalue.Exception设为null表示异常已经被处理过了
retvalue.Exception = null;
}

#endregion

return retvalue;
}

/// <summary>
/// 获取一个<see cref="Boolean"/>值,该值表示当前拦截行为被调用时,是否真的需要执行某些操作。 Created by ZhangQc 2016.08.17
/// </summary>
public bool WillExecute
{
get { return true; }
}
}

时间: 2024-08-08 13:55:05

拦截所有经过IOC的方法的相关文章

struts2 全局拦截器,显示请求方法和参数

后台系统中应该需要一个功能那就是将每个请求的url地址和请求的参数log出来,方便系统调试和bug追踪,使用struts2时可以使用struts2的全局拦截器实现此功能: import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; im

详述 Spring MVC 框架中拦截器 Interceptor 的使用方法

1 前言 昨天新接了一个需要,"拦截 XXX,然后 OOO",好吧,说白了就是要用拦截器干点事(实现一个具体的功能).之前,也在网络上搜了很多关于Interceptor的文章,但感觉内容都大同小异,而且知识点零零散散,不太方便阅读.因此,正好借此机会,整理一篇关于拦截器的文章,在此分享给大家,以供大家参考阅读. 2 拦截器 2.1 概念 Java 里的拦截器是动态拦截 action 调用的对象.它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个

struts2 全局拦截器,显示请求方法和參数

后台系统中应该须要一个功能那就是将每一个请求的url地址和请求的參数log出来,方便系统调试和bug追踪,使用struts2时能够使用struts2的全局拦截器实现此功能: import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; i

Runtime 应用(一)拦截系统自带的方法交换实现

动态的交换方法能够给项目中大量已经使用的方法 进行拦截增加操作 实践:利用运行时交换系统的ImageNamed:方法 应用背景 当系统需要适配ios7和ios8时可能会有显示不同图片的需求,但在老项目上开发ios7程序时并未考虑到ios8的适配,当项目上有几百处地方用到ImageNamed:方法时,如果选用最直接的办法,在该方法之前进行判断,如果为ios8就显示另外一张图片,这样的工作量明显会很大,所以可以用运行时的方法来解决. 新建一个项目,准备两张图片,一张图片名为close为ios7而准备

在struts2中配置自定义拦截器放行多个方法

源码: 自定义的拦截器类: //自定义拦截器类:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.inte

【Spring】IOC之方法注入

方法注入在我看来就是为了实现在单例类中取得不同的实例类对象. 当一个Bean依赖的Bean和自己生命周期不同的时候:如Bean A依赖Bean B,Bean A 是singleton,如果需要在Bean A每次用到Bean B的时候都用一个Bean B的新的实例(注意是新的),即使通过在配置文件设置Bean B的 property或者 contructor-arg是不能实现的.这时候只能在Bean A中用Bean B的时候动态得到. 或者可以这么说, 调用一个singleton类型bean A的

dubbo中拦截生产者或消费者服务方法调用

比如当前有个需求,需要拦截dubbo的服务提供方或者服务消费方的方法,判断参数中是否包含某个关键字进行拦截阻止执行,那么我们可以通过使用dubbo的SPI机制通过实现Filter类来拦截,话不多说直接上代码: 1.新建一个类实现dubbo的Filter接口 /** * 回滚任务Dubbo拦截正在回滚或备份小区的方法调用,阻止执行 * @author wl * @date 2019-08-16 13:24 */ @Activate(group={ Constants.PROVIDER, Const

struts2拦截器-自定义拦截器,放行某些方法(web.xml配置)

一.web.xml配置 <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-val

IOC doGetBean 方法解析

protected <T> T doGetBean( final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { final String beanName = transformedBeanName(name); Object bean; // 先从缓存中取 Object sharedInstance = ge