Java CDI:拦截器有范围吗?

Jon*_*her 4 java guice java-ee cdi weld

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

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

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

    @AroundInvoke
    public Object intercept(InvocationContext context) throws Exception {
...
    }
Run Code Online (Sandbox Code Playgroud)

jpa*_*rca 12

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


Jan*_*ski 5

是的,拦截器具有像任何其他 cdi 托管 bean 一样的生命周期...因此它们默认是依赖的,但您可以使用您需要的任何范围来注释它们。在您的示例中,同一请求中的所有调用共享拦截器。如果您需要的是“每次调用都使用相同的拦截器”,那么您应该考虑更广泛的范围,例如会话或应用程序。

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