cod*_*erz 6 java spring spring-mvc
我有使用SpringMVC的以下Controller代码:
@Controller
@Scope("prototype")
@RequestMapping("/messages")
public class MessageController {
@RequestMapping(value="/index", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public String displayAllMessages(ModelMap model) {
System.out.println(this.hashCode());
// processing
return "messages";
}
}
Run Code Online (Sandbox Code Playgroud)
当使用时@Scope("prototype"),每个请求都会出现,输出this.hashCode()不同,这意味着当每个请求到来时,MessageController将创建一个新实例.
如果不使用@Scope("prototype"),默认将是@Scope("singleton"),每个请求到来,输出this.hashCode()相同,意味着只MessageController创建一个实例.
我不确定什么时候应该使用@Scope("prototype"),什么时候不用?
JB *_*zet 10
我们说你 代码像猪和 在你的控制器中执行类似的操作:
private List<String> allMessages;
public String displayAllMessages(ModelMap model) {
allMessages = new ArrayList<>();
fillMessages();
model.put(messages, allMessages);
return "messages";
}
private void fillMessages() {
allMessages.add("hello world");
}
Run Code Online (Sandbox Code Playgroud)
您的控制器将变为有状态:它具有allMessages无法在两个请求之间共享的state().控制器不再是线程安全的.如果同时调用它来处理两个并发请求,则可能存在竞争条件.
您可以通过使控制器成为原型来避免此问题:每个请求将由单独的控制器处理.
或者你可以做正确的事情并使代码无状态,在这种情况下,为每个请求创建一个新的控制器将是无用的,因为控制器将是无状态的,因此线程安全.然后范围可以保持其默认值:singleton.
public String displayAllMessages(ModelMap model) {
List<String> messages = fillMessages();
model.put(messages, allMessages);
return "messages";
}
private List<String> fillMessages() {
List<String> allMessages = new ArrayList<>();
allMessages.add("hello world");
return allMessages;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6116 次 |
| 最近记录: |