我有三个具有不同范围的类:

// 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的请求一样?

另外,由于某种原因,这可能会导致性能问题?

谢谢!

最佳答案

是否要为每个新请求重新注入UniqueInstance的依赖关系,以遵守其范围?


在谈论会话bean时是,对于默认值/依赖项则是。让我们先说@Inject private SomeSessionScopedInstance sessionData;。该会话将始终包含该用户当前会话的数据,如果您尝试在没有一个会话的情况下在服务器端使用它,则它将崩溃。具体操作方式取决于实现,但是对于Weld(您可能会使用),它基于线程局部变量。它将提取与当前正在执行代码的线程绑定的会话(这是现实的简化版本)。

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


  这个设计可能会有并发问题吗?就像某些要求其他用户访问SomeSessionScopedInstance的请求一样?


不,由于我上面的描述。您只有一个会话绑定到线程,仅此而已。


  另外,由于某种原因,这可能会导致性能问题?


太含糊的问题。如果您对代码进行不好的编程,无论其背后的设计是什么,都可能会产生性能问题。

10-07 19:34
查看更多