我有三个具有不同范围的类:
// 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的请求一样?
不,由于我上面的描述。您只有一个会话绑定到线程,仅此而已。
另外,由于某种原因,这可能会导致性能问题?
太含糊的问题。如果您对代码进行不好的编程,无论其背后的设计是什么,都可能会产生性能问题。