當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring MVC不要在@Service bean中保存状态
生活随笔
收集整理的這篇文章主要介紹了
Spring MVC不要在@Service bean中保存状态
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
先看這么一段代碼:
@Service public class AccountService {private String message;public void foo1() {if (true) {this.message = "a";} else {this.message = "b";}}public void foo2() {// 改動this.message的代碼...// ... ...} }假設(shè)你打算在@Controller里這么調(diào)用AccountService :? accountService.foo1();model.addAttribute(accountService.getMessage());
那么就有線程安全的危急了。
問題原因
在Spring中。bean的默認(rèn)scope是singleton,也就是說容器中僅僅有一個bean的實(shí)例。而在Java Web環(huán)境中,webserver會為每個請求創(chuàng)建一個線程來處理它。這樣一來。在@Controller中調(diào)用@Service bean的方法就會導(dǎo)致有多個線程在運(yùn)行@Service方法。比如線程A在運(yùn)行foo1()方法,線程B在運(yùn)行foo2()方法。那么問題來了,多個線程同一時候讀寫message成員變量。就可能讓getMessage()方法返回錯誤的值
解決方法
1. 將@Service bean的scope改為 "request",即: @Service @Scope("request") public class AccountService {private String message;這樣Spring會為每個請求分別創(chuàng)建一個AccoutService對象,每個線程都有自己的message變量。就不會出錯了。
但壞處是創(chuàng)建@Service bean的開銷往往比較大,會導(dǎo)致程序性能下降。
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");}// ... ...}
這樣便能夠完美避免線程安全問題,又不會帶來過多的額外開銷。
總結(jié)
以上是生活随笔為你收集整理的Spring MVC不要在@Service bean中保存状态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IT十八掌作业_java基础第二天_进制
- 下一篇: 软件测试第一次作业