Java CDI:拦截器有范围吗?

时间:2014-07-19 16:32:26

标签: java java-ee cdi guice weld

CDI中拦截器的范围是什么?

又名,这是合法的吗?我会在每个被调用的地方获得相同的拦截器实例吗?

@RequestScoped
public class SalesForceControllerInterceptor {
    @Inject
    private Logger log;

    @AroundInvoke
    public Object intercept(InvocationContext context) throws Exception {
...
    }

2 个答案:

答案 0 :(得分:12)

CDI 1.1 spec表示拦截器应该是Dependent,否则会导致非可移植行为。例如,Weld 2.2.6不允许具有除Dependent之外的范围的拦截器,并将它们视为定义错误。

答案 1 :(得分:4)

是的,拦截器的生命周期与任何其他cdi托管bean一样......因此它们默认依赖,但您可以使用任何需要的范围对它们进行注释。 在您的示例中,同一Request中的所有调用都共享拦截器。如果您需要的是每个呼叫的相同拦截器",您应该考虑更广泛的范围,如会话或应用。

更新:检查注释:cdi 1.1拦截器必须属于依赖范围,而Weld 2.2.6将其他范围视为错误。