繁体   English   中英

CDI为bean选择正确的范围

[英]CDI choosing correct scope for bean

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

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

假设我有一个隐藏外部服务API调用的bean。 它是完全无状态的。 我应该将其@Singleton@Singleton还是仅在应用程序范围内使用? 或者让它在每个请求上创建(可能是错误的选择)。

将所有内容注入各处是否正确? 在Spring中,我通过new创建数据对象。 我应该在CDI中执行相同操作还是直接@Inject

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

@Service
@Scope("prototype")
public class CustomerService 
{
......
}

只需在组件中添加@Scope(“ prototype”)批注即可。

您是否有理由需要bean来记住它的状态? 如果您使用的是Web客户端之类的东西,那么这是一个更好的存储状态的条件,例如会话范围内的受管bean(假设jsf)或您所用的任何等效物。 在后端服务器端,最好将EJB的名称保持为@stateless,以将开销降至最低,并帮助“保持简单的……”模式。如果此方法有效,只需在bean上声明@Stateless。除非有理由使用单例,否则,如果要为服务使用Java EE容器,则最好使用无状态Bean。

并非每次请求都真正创建无状态Bean。 那就是游泳池的目的。 应用程序服务器可以随时供应无状态的Bean,如果繁忙,它将获得更多收益;如果安静,它将清空其中的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM