当@ApplicationScoped注入另一个类时,@A​​pplicationScoped bean中的不同范围的依赖关系是否会再次重新注入?

时间:2017-06-28 01:54:04

标签: java dependency-injection scope cdi

我有三个不同范围的课程:

// default scope
public class DefaultScopedInstance {
    private String someAttribute;
}

@SessionScoped
public class SomeSessionScopedInstance implements Serializable {
    private String username;
    private String email;
}

@ApplicationScoped
public class UniqueInstance {

    private Clazz someUniqueData; //just an example. could be anything

    @Inject
    private SomeSessionScopedInstance sessionData;

    @Inject
    private DefaultScopedInstance someOtherData;
}

然后将UniqueInstance注入JAX-RS控制器(RequestScoped),如下所示:

@Path("/someService")
public class SomeRestSevice {
    @Inject
    private UniqueInstance uniqueInstance;
}

是否会为每个新请求重新注入UniqueInstance的依赖关系,以便尊重其范围?

这可能与此设计同时存在问题?就像有些请求从其他用户访问SomeSessionScopedInstance一样?

此外,由于某些原因,这可能会出现性能问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

对于每个新请求,是否会再次重新注入UniqueInstance的依赖项以尊重其范围?

在谈论会话bean时是,对于默认/从属是否。让我们先谈谈@Inject private SomeSessionScopedInstance sessionData;。这个将始终包含用户当前会话的数据有一个会话,如果你尝试在没有一个的情况下在服务器端使用它,它将会爆炸。有关如何完成此操作的详细信息取决于实现,但对于Weld(您可能使用),这是基于线程局部变量。它将提取绑定到当前正在执行代码的线程的会话(这是现实的简化版本)。

至于@Inject private DefaultScopedInstance someOtherData; - 这个不会被重新注入"。它是@Dependent,意味着它的生命周期与注入的对象@ApplicationScoped bean相同。因此,只要AppScoped bean存在,它就是同一个实例。

  

这可能与此设计同时存在问题?就像有些请求从其他用户访问SomeSessionScopedInstance一样?

不,由于我上面所描述的。你只有一个会话绑定到线程,那就是那个。

  

此外,由于某些原因,这可能会出现性能问题?

太模糊的问题。如果您对其进行严格编码而无论背后的设计如何,任何事情都可能存在性能问题。