Bean作用域
名稱 | 作用域 |
---|---|
singleton | 單例物件,預設值的作用域 |
prototype | 每次獲取都會建立一個新的 Bean 例項 |
request | 每一次 HTTP 請求都會產生一個新的 Bean,該 Bean 僅當前 HTTP request 內有效 |
session | 在一次 HTTP session 中,容器將返回同一個例項 |
global-session | 將物件存入到 web 專案叢集的 session 域中,若不存在叢集,則 global session 相當於 session |
預設作用域是 Sigleton,多執行緒訪問同一個 Bean 時會存線上程不安全問題
保障執行緒安全方法:
- 在 Bean物件中儘量避免定義可變的成員變數(不太實際)
- 在類中定義一個 ThreadLocal 成員變數,將需要的可變成員變數儲存在 ThreadLocal 中
啟動初始化
@PostConstruct:
在 Bean 建立期間由 Spring 呼叫的初始化方法
- 使用:將 @PostConstruct 註解新增到方法上就行
InitializingBean:
實現 InitializingBean 介面,讓 Spring 呼叫某一個初始化方法
Controller 和 Service 是否執行緒安全的
預設情況下,Scope 值是單例(Singleton)的,是執行緒不安全的。
儘量不要在 @Controller / @Service 等容器中定義靜態變數,不論是單例還是多例都是執行緒不安全的。