APM 拦截器Scope的应用

这里写代码片使用拦截器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’已经执行结束了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值