2013-02-28 110 views
5

我對這個話題有些懷疑。 在我們的大多數Spring bean(道具,服務和控制器)的應用程序中,我們使用「請求」範圍。這種方法可以減少內存使用量並創建無狀態層。但另一方面,我們在Spring上下文初始化的每個請求上都放棄了性能。 我想創造一些豆類,例如DAO層,在「單例」或「原型」範圍內。Web應用程序中的Spring bean範圍。最佳做法

你在你的應用程序中使用了什麼技術? 也許存在一些設計Spring Web應用程序bean作用域的建議?

+0

他們爲什麼要求範圍?他們有會員資料嗎? – 2013-02-28 20:47:30

回答

12

的一般規則,我傾向於使用決定何時如下:

長壽國家

這是當國家需要保留在多個請求(HTTP)。在這種情況下,存儲在會話範圍內是有意義的。

短命的國家

當你需要堅持國家對於任何給定的請求。也許你正在爲一個表單實現一個支持bean的東西。在這種情況下,我使用請求範圍。

任何國家

這是單身,並通過從春天默認生成。除非我對狀態有特定的要求,否則我通常堅持使用所有的bean。當然,它也是更高性能的,因爲bean只創建一次並被所有人使用。

在你的情況,你的DAO &服務應該是無狀態的(如果他們不重新思考你是如何實現它們的),因此應該是單身。控制器應該再單身,但是你的問題是它們是否包含狀態?。我不會過多擔心內存消耗,記得萬惡之根是早熟優化。堅持最好的做法,如果這不起作用,然後修復它。

5

Singleton:根據Spring IoC容器將單個bean定義作用於單個對象實例。

原型:將單個bean的定義作用於任何數量的對象實例。

請求:將單個bean定義作用於單個HTTP請求的生命週期;也就是說,每個HTTP請求都有自己的實例,這個實例是在單個bean定義的背後創建的。只有在Web感知的Spring ApplicationContext的上下文中才有效。

會話:將範圍定義爲HTTP會話生命週期的單個bean定義。只有在Web感知的Spring ApplicationContext的上下文中才有效。

全局會話:將全局HTTP會話生命週期中的單個bean定義作用域。通常僅在Portlet上下文中使用時纔有效。只有在Web感知的Spring ApplicationContext的上下文中才有效。

除了這個信息,你應該標記您的DAO爲@Repository,與@Controller@Service你的服務層控制器。

Service, Repository and Controller Discussion

相關問題