日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring MVC不要在@Service bean中保存状态

發布時間:2025/3/19 javascript 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring MVC不要在@Service bean中保存状态 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先看這么一段代碼:

@Service public class AccountService {private String message;public void foo1() {if (true) {this.message = "a";} else {this.message = "b";}}public void foo2() {// 改動this.message的代碼...// ... ...} }
假設你打算在@Controller里這么調用AccountService :?

accountService.foo1();model.addAttribute(accountService.getMessage());

那么就有線程安全的危急了。


問題原因

在Spring中。bean的默認scope是singleton,也就是說容器中僅僅有一個bean的實例。而在Java Web環境中,webserver會為每個請求創建一個線程來處理它。這樣一來。在@Controller中調用@Service bean的方法就會導致有多個線程在運行@Service方法。比如線程A在運行foo1()方法,線程B在運行foo2()方法。

那么問題來了,多個線程同一時候讀寫message成員變量。就可能讓getMessage()方法返回錯誤的值


解決方法

1. 將@Service bean的scope改為 "request",即: @Service @Scope("request") public class AccountService {private String message;
這樣Spring會為每個請求分別創建一個AccoutService對象,每個線程都有自己的message變量。就不會出錯了。

但壞處是創建@Service bean的開銷往往比較大,會導致程序性能下降。


2. 使用不可變對象(Immuable Object)封裝message變量 定義例如以下類: class MessageWrapper {private String message;public MessageWrapper(String msg) {this.message = msg;}// 僅僅提供get方法public String getMessage() {return this.message;} }
AccountService的foo1()方法改動例如以下: @Service public class AccountService {public MessageWrapper foo1() {if (true) {return new MessageWrapper("a");} else {return new MessageWrapper("b");}// ... ...}
這樣便能夠完美避免線程安全問題,又不會帶來過多的額外開銷。

總結

以上是生活随笔為你收集整理的Spring MVC不要在@Service bean中保存状态的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。