我有三个不同范围的课程:
// 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
一样?
此外,由于某些原因,这可能会出现性能问题?
谢谢!
答案 0 :(得分:2)
对于每个新请求,是否会再次重新注入UniqueInstance的依赖项以尊重其范围?
在谈论会话bean时是,对于默认/从属是否。让我们先谈谈@Inject private SomeSessionScopedInstance sessionData;
。这个将始终包含用户当前会话的数据有一个会话,如果你尝试在没有一个的情况下在服务器端使用它,它将会爆炸。有关如何完成此操作的详细信息取决于实现,但对于Weld(您可能使用),这是基于线程局部变量。它将提取绑定到当前正在执行代码的线程的会话(这是现实的简化版本)。
至于@Inject private DefaultScopedInstance someOtherData;
- 这个不会被重新注入"。它是@Dependent
,意味着它的生命周期与注入的对象@ApplicationScoped
bean相同。因此,只要AppScoped bean存在,它就是同一个实例。
这可能与此设计同时存在问题?就像有些请求从其他用户访问SomeSessionScopedInstance一样?
不,由于我上面所描述的。你只有一个会话绑定到线程,那就是那个。
此外,由于某些原因,这可能会出现性能问题?
太模糊的问题。如果您对其进行严格编码而无论背后的设计如何,任何事情都可能存在性能问题。