CDI注入跨请求提供不同的实例

CDI Injection giving different instances across request

我正在尝试在 JAX-RS 休息请求中使用 CDI 注入。具体来说,我有一个 ContainerReqeustFilter、rest 端点 class 和一个 ContainerResponseFilter。在 ContainerReqeustFilter 中,我有一个简单的 bean 注入:

public class BeanTest {
    private String content;
    public String getContent() { return content; }
    public void setContent(String value) { content = value; }
}

在我的 ContainerRequestFilter 中:

@Inject BeanTest beanTest;

在我的 ContainerResponseFilter 中还有:

@Inject BeanTest beanTest;

但是,我得到了两个不同的 BeanTest bean 实例,而不是我预期的同一个实例。为什么是这样?我希望在整个请求中重用同一个 BeanTest 实例。

我还尝试了以下 class:

@Inject BeanTest beanTest;
@Inject BeanTest beanTest2;

同样,beanTest 和 beanTest2 是不同的实例。

最后,我也试过了:

@Inject @RequestScoped BeanTest beanTest;

@Inject @SessionScoped BeanTest beanTest;

两者都没有改变任何明显的行为。我的最终目标是跨 classes 在休息服务调用期间调用的可重用 bean。

我在 BeanTest 上没有看到任何注释,这意味着,如果您使用的是 bean-discovery-mode=all,则此类 bean 默认情况下被视为在 Dependent scope 中。这意味着它们的生命周期对注入它们的 bean 很累,并且在使用它的每个不同 bean 中注入一个不同的 bean 实例。

使用正确的作用域(如果您需要应用范围的 bean、ApplicationScope 等)

http://docs.jboss.org/weld/reference/latest-master/en-US/html/beanscdi.html#_scope