2

来自 Spring 的普通旧 DI,我无法弄清楚在使用 CDI 编写时如何正确选择范围。

在 Spring 中,默认情况下我的所有服务都具有单例范围,我想它映射到 CDI 中的应用程序范围(甚至是 @Singleton)。我知道例如登录用户信息我需要使用会话范围,例如表单参数我需要请求范围。

假设我有一个隐藏外部服务 API 调用的 bean。它是完全无国籍的。我应该把它作为@Singleton或简单的应用程序范围?或者让它在每个请求上创建(可能是错误的选择)。

到处注入所有东西是否正确?在 Spring 中,我通过new. 我应该在 CDI 中做同样的事情还是干脆在@Inject他们身上做同样的事情?

4

3 回答 3

1

你只使用CDI吗?还是 Java EE 6 容器?如果您有一个用于服务调用的无状态类,那么我建议您使用来自 EJB 规范的 @Stateless(因此您需要一个 Java EE 6 容器)它不是单例,但它不是也可以在每个请求上创建。我相信它与会话的绑定更紧密,但由于它是无状态的,因此可以汇集和共享实例。如果您只处理 CDI,我相信 Singleton 更直接地匹配 Spring 的单例,但我建议使用 ApplicationScoped,因为它提供了一个代理,使得使用它的 bean 的序列化变得更容易。

于 2012-10-18T23:45:11.273 回答
0
@Service
@Scope("prototype")
public class CustomerService 
{
......
}

Just add @Scope("prototype") annotation to your component.

于 2012-10-18T22:37:28.037 回答
0

是否有理由需要 bean 记住它的状态?如果您使用的是 Web 客户端之类的东西,那么这是一个更好的地方来存储状态,比如会话范围的托管 bean(假设 jsf),或者您的情况的任何等价物。在后端服务器端,您的 EJB 最好保留为 @stateless,以将开销降至最低,并有助于“保持简单...”范式。如果这可行,只需在您的 bean 上声明 @Stateless。除非有理由使用单例,否则如果您想为您的服务使用 Java EE 容器,最好还是使用无状态 bean。

无状态 bean 并没有真正随着每个请求而重新创建。这就是游泳池的目的。应用服务器手头有现成的无状态 bean,如果它很忙,它会制造更多,如果它安静下来,它会清空一些。

于 2012-10-22T01:35:35.083 回答