`
haierboos
  • 浏览: 439550 次
文章分类
社区版块
存档分类
最新评论

Spring学习笔记: 关于Advisor和PointcutAdvior

 
阅读更多

关于Advisor和PointcutAdvior


Advisor是用来持有(hold)一种advice的,它有一个getAdvice()方法,专门来得到其所持有的advice而pointcutAdvior继承自Advisor接口,同时本身又提供了一个getPointcut方法,这十分明确地说明:pointcutAdvior是用来组装advice和pointcut这两个切面的重要组成元素的,因此我们说pointcutAdvisor才是一个切面的实例模块,而不是有些书上说的Advisor!

理论上讲:我们想实现自己的一个切面,只要需提供一个实现advisor接口的类和一个实现pointcut接口的类,然后用一个pointcutAdvisor接口的实现类来把把来个类组装起来就构成了我们自己的切面实例.但是事实上spring框架为我们提供了很多的子接口和实现类,来简化我们的工作,这包括:

1.advice:AfterAdvice AfterReturningAdvice MethodBeforeAdvice 等接口
2.pointcut:NameMatchMethodPointcut(最常用),还有与之相对应的DynamicMethodMatcherPointcut
3.pointcutAdvisor:在框架里每有一个pointcut,就会有一个与之对应的pointcutAdvisot例如上面提到的NameMatchMethodPointcut就有一个对其对应的StaticMethodMatcherPointcut.另外还有一种功能十分
强大的正则表达式pointcutAdvisor:RegexpMethodPointcutAdvisor(注意:这个pointcutAdvisor是没有
与其对应的pointcut存在的.也说是没有RegexpMethodPointcut这么一个类),它使用正则表达式来描述
它的pointcut. 最后提到的一个就是:DefaultPointcutAdvisor这是一个使用频率很高的

PointcutAdvisor,一般来说我们就是用它来组装我们写好的advice和pointcut!
它有两个属性:advice和pointcut正好用来接受我们提供给它的dvice和pointcut.

关于pointcutAdvisot的使用:两种情况:一种是我们定义自己的advice,又定义了一个pointcut,那么,
显然,这时我们应该使用DefaultPointcutAdvisor来装配我们的Dvice和pointcut.第二种情况是:
我们其实可以只定义自己的advice,然后直接选用一种pointcutAdvisor来装配,至于pointcut,则是
通过设置这种pointcutAdvisor的一个pattern属性来在这个ointcutAdvisor的内部自动生成一个

pointcut.这种方法较第一种要简洁不少,代码的书写量也少了很多(因为不用专门去写一个pointcut类
和其对就的配制了),缺点是这个装配的过程显得有点"古怪",原为看起来好像少了pointcut.
最后再次强调的时:如果采取第二种方式,那么我们应该首选:RegexpMethodPointcutAdvisor.它通过正则

表达式来指定切入点,其若能是十分强大而方便的.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics