这里写代码片使用拦截器Scope以避免重复跟踪
这种情况比较普遍,例如有方法A和方法B,方法A中调用方法B,这两个方法又都可以被独立调用。即可能产生的调用路径有:
外部->A->B
外部->B
如果对A和B都注入拦截器,那么在上述嵌套调用时,会产生重复跟踪的情况。
这时一来拦截器不容易编码,可能需要考虑嵌套跟踪的干扰,二来重复跟踪是不必要的。
为了避免这种情况,可以使用Scope拦截器。
使用InterceptorScope来指定一个Scope,使用ExecutionPolicy来指定一种策略。
ExecutionPolicy有3种策略:
ALWAYS: 始终执行
BOUNDARY: 一个Scope下,只能有一个拦截器在执行
INTERNAL: 必须在另一个相同Scope的拦截器在执行时,才执行
其中,默认的策略是BOUNDARY,即不能嵌套拦截。
使用拦截器Scope以共享数据
例如有方法A和方法B,方法A中调用方法B。
如果需要拦截方法A和方法B,并且需要在拦截这2个方法的过程中传递/共享一些数据,那么就需要使用Scope来传递这些数据。
在这个例子里,A和B的拦截器都设置同一个Scope,并且设置B的ExecutionPolicy为INTERNAL,A的拦截器中产生共享数据,并且在B的拦截器中使用共享数据。
共享数据的传递交给Scope完成。
使用拦截器Scope拦截构造方法
构造方法拦截器也可以设置Scope,但是请注意,设置构造方法拦截器的Scope和设置普通方法拦截器Scope的概念和影响是不同的。
这是因为java对于构造方法嵌套的限制造成的。
对于普通方法来说,如果方法A调用方法B,那么这2个方法的拦截器A’和B’中方法的执行顺序是这样的:
A’.before()->B’.before()->B’.after()->A’.after()
而对于构造方法来说,如果类B继承类A,那么这2个类的构造方法的拦截器A’和B’中方法的执行顺序是这样的:
A’.before()->A’.after()->B’.before()->B’.after()
所以,如果要设置构造方法的拦截器Scope,那么要注意,即使设置了策略为BOUNDARY,也不会使上例中的B’中的方法不执行,因为在B’执行时,A’已经执行结束了。