用Logger来解释拦截

HZ

动态代理学了 不知道在工作中杂用哦

HE

现在一般不会直接用吧,一般都是用aspectJ这种完整aop的实现

STST

拦截方法调用

HZ

我见过把所有accessor方法放到切面的

还有transaction肯定都是在切面的

STST

比如一个方法,记录要保存起来
用来验证用户名密码,如果不拦截的话就要如下处理
bool Valid(string user,string pwd)
{
ret=验证用户名密码(user,pwd);
记录日志(time,user,pwd,ret);
返回 ret;
}

ZH

典型的就是你会用spring就好了

STST

这种方式把不是Valid必须要得逻辑牵扯进来了

HE

嗯嗯,spring实现的事务是一个比较好的例子

简单理解就是在service方法执行之前动态调用申明事务开始,在方法结束后执行事务提交,方法本身中看不到和事务打交道的代码

ZH

前段时间测的一个jar,开发用了动态代理,不过一般web开发是用不上的

STST

如果拦截的话就相当于下面,客户端对Valid的调用被拦截到另外一个方法:
bool Valid2(string user,string pwd)
{
ret=Valid(user,pwd);
记录日志(time,user,pwd,ret);
return ret;
}

这样把记录日志的 功能从Valid方法移动到Valid2方法上来了

HZ

ok

STST

而Valid2方法是用户来写的代码,不是Valid方法的作者写的

HE

logger也是个非常棒的例子

STST

这样Valid2实际上是可扩展的,因为是由客户写的

HZ

这样说拦截器 都是动态代理实现的了

STST

,是一个说法

不过动态代理有多种实现

前面提到的直接修改字节码,外覆类都是一种途径

还有就是在源程序编译时拦截,对于静态类型的语言来说,这是唯一的方式,如C/C++

原文地址:https://www.cnblogs.com/stst/p/4908817.html