ACtion的多例和單例(網站看到的。自己遇到的)

背景 :
1:struts2會默認對每一個請求都產生一個新的action實際例子來處理
2: Spring的Ioc容器(實現)管理的bean默認是單實例的.因爲它是把bean注入進去的,都是同一個bean,所以認爲是單實例。
狀況:
當Struts2與Spring整合後,由Spring來管理Struts2的Action,會遇到什麼問題 ?如何解決 ?

問題:
由spring來管理Struts2的Action, bean默認是單實例有情況下,會有如下問題:
1: Struts2的Action是單例,其中的FieldError,actionerror中的錯誤信息會累加, 即使再次輸入了正確的信息,也過不了驗證.尤其是配置了國際化後。在登錄頁面。第一次輸入錯誤後,第二次輸入正確,還是會提示輸入錯誤。

2:struts 2的Action中包含數據,例如你在頁面填寫的數據就會包含在Action的成員變量裏面。如果Action是單實例的話,這些數據在多線程的環境下就會相互影響,例如造成別人填寫的數據被你看到了。

場景:
1:類似於管理系統中,添加商品,刪除。修改等等。需要設置爲多例。因爲最終都是需要通過數據庫來修改,雖然可以獲取多個連接,但管理數據庫連接池的卻只有一個,所以可以做到,每次的修改都能生效,並且後來者可以看到前面人的修改結果。如果是單例,那麼可能最後只會存在最後一次的修改結果,而前面的都看不到。

2:還有類似的用戶操作,用戶登錄等等,都需要多例,在固定了一個spring容器的情況下,(因爲在一個項目中。servletContext只有一個。而spring本身具備一個監聽器,可以讓spring容器綁定到web容器中,)
採用多例,能避免線程安全問題

解決方案:
方案一: 就是不用單例, spring中bean的作用域設爲prototype,每個請求對應一個Action實例.(建議這樣做)

方案二: spring中bean的作用域設爲session ,每個session對應一個實例,解決了多線程問題.

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