Spring 中的 bean 的作用域有哪些?

singleton : 唯一 bean 實例,Spring 中的 bean 默認都是單例的。
prototype : 每次請求都會創建一個新的 bean 實例。
request : 每一次HTTP請求都會產生一個新的bean,該bean僅在當前HTTP request內有效。
session : 每一次HTTP請求都會產生一個新的 bean,該bean僅在當前 HTTP session 內有效。
global-session: 全局session作用域,僅僅在基於portlet的web應用中才有意義,Spring5已經沒有了。Portlet是能夠生成語義代碼(例如:HTML)片段的小型Java Web插件。它們基於portlet容器,可以像servlet一樣處理HTTP請求。但是,與 servlet 不同,每個 portlet 都有不同的會話。

Spring 中的單例 bean 的線程安全問題了解嗎?
大部分時候我們並沒有在系統中使用多線程,所以很少有人會關注這個問題。單例 bean 存在線程問題,主要是因爲當多個線程操作同一個對象的時候,對這個對象的非靜態成員變量的寫操作會存在線程安全問題。

常見的有兩種解決辦法:
在Bean對象中儘量避免定義可變的成員變量(不太現實)。
在類中定義一個ThreadLocal成員變量,將需要的可變成員變量保存在 ThreadLocal 中(推薦的一種方式)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章