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());
那么就有线程安全的危险了。
问题原因
解决方法
@Service @Scope("request") public class AccountService { private String 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"); } // ... ... }
这样便可以完美避免线程安全问题,又不会带来过多的额外开销。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。