用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++