隨著越來越多的人將Spring MVC或JSF-Spring集成用于他們的應用程序,除了更傳統的Singleton和Prototype范圍之外,Spring Bean現在更頻繁地用于請求/會話范圍。
剛開始使用各種Spring范圍的開發人員最初的好奇心之一是,這些范圍在Web應用程序中以及在需要編寫安全的并發代碼的情況下的行為方式。 好吧,這個“否”的答案就是要對這些范圍進行過度考慮,因為它們的行為與命名方式完全相同。 讓我們以JSF-Spring集成為例,其中所有JSF bean都由Spring IOC容器加載,并且bean的作用域也使用假定的Spring的@Scope注釋定義。
具有@Scope(“ request”)的bean可以在任何新的傳入請求中創建,因此可以保證它的線程安全,因為它是在每次有新請求進入時創建的。接下來是@Scope(“ session”) bean,對于在用戶的每個會話中,如果用戶通過瀏覽器的多個選項卡訪問應用程序,則該bean范圍肯定會出現并發問題,因此對于開發人員而言,確保共享會話數據的狀態不會損壞很重要。
現在是@Scope(“ singleton”)或Spring Bean的默認范圍,這些單例Bean在繁重的Web應用程序中的行為如何。 首先,重要的是要了解“ Singleton”僅意味著一個實例,即應用程序將僅具有該bean的一個實例。 現在,Spring框架對于這個Singleton bean的多線程行為并沒有做任何事情 ,即它只是一個普通的Singleton bean,并且由開發人員來處理與該bean有關的并發問題。
現在出現了一個問題,Web應用程序中應將哪種bean用作Singleton ,答案很簡單: 任何沒有STATE的Bean都可以是singleton 。 例如,可以輕松地成為單例的bean是DAO , Service , Controller這些控制器沒有自己的狀態,而是我們在應用程序中利用這些bean執行某些操作。DAO層bean可以是單例,因為它們沒有具有各自的狀態,但是每個線程使用DAO bean進行訪問以執行特定于線程的操作,因此DAO bean不受其自身并發訪問的影響,因為它沒有其自身的狀態。
選擇Singleton bean的一個非常糟糕的例子是需要維護其狀態的bean,在這種情況下,每個線程都會嘗試通過破壞數據將自己的狀態強加到該bean上。 例如,如果將具有名稱和年齡的設置器和獲取器的Person bean設為單例。 現在,如果有多個線程開始訪問此bean,它們將繼續覆蓋Person實例的最后一個設置值,從而破壞狀態。
結論–請記住黃金法則: 僅選擇那些沒有狀態的bean作為單例
參考:來自我們JCG合作伙伴 Tarun Sapra的Spring Singleton,請求,會話Bean和線程安全 ,在“ Java Enterprise Ecosystem”博客上 。
相關文章 :
- Spring依賴注入技術的發展
- Spring MVC開發–快速教程
- 每個人都知道MVC…
- Spring MVC3 Hibernate CRUD示例應用程序
- 使用Spring Security保護GWT應用程序
- Java教程和Android教程列表
翻譯自: https://www.javacodegeeks.com/2011/11/spring-singleton-request-session-beans.html