2012-10-18 62 views
2

来自春天的普通旧DI我无法弄清楚如何在用CDI书写时正确选择范围。CDI为豆选择正确的范围

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

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

这是正确的注入一切到处?在春天,我通过new创建了我的数据对象。我应该在CDI中做同样的事,还是仅仅在@Inject呢?

回答

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

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

1

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

+0

谢谢,我是使用JEE应用服务器。是的,我可以使用Stateless。 – grafthez

+0

In Weld和OWB(不知道CanDI)'@ Singleton'和'@Applic ationScoped'实际上是一样的。 – LightGuard

0

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

无状态bean并不是真正被重新创建的每一个请求。这个应用服务器保留了现成的无状态bean的供应,如果它变得忙碌,它会做得更多,并且如果它静止下来,它将会腾出一些空闲空间。