2012-10-18 152 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的供應,如果它變得忙碌,它會做得更多,並且如果它靜止下來,它將會騰出一些空閒空間。