【发布时间】:2014-02-05 08:08:33
【问题描述】:
代码:
package com.test.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;
@RestController
@RequestMapping("/")
public class Controller {
private HttpServletRequest request;
public HttpServletRequest getRequest() {
return request;
}
@Autowired
public void setRequest(HttpServletRequest request) {
this.request = request;
}
@RequestMapping("safe-read")
public void threadSafeRead() throws InterruptedException {
System.out.println(request.getHeader("user-agent"));
Thread.sleep(TimeUnit.MILLISECONDS.convert(5,TimeUnit.SECONDS));
System.out.println(request.getHeader("user-agent"));
}
}
当我同时做两个请求时,这个执行的结果是:
- Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 火狐/26.0
- Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, 像 壁虎)Chrome/32.0.1700.102 Safari/537.36
- Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 火狐/26.0
- Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, 像 壁虎)Chrome/32.0.1700.102 Safari/537.36
在运行时字段中输入com.sun.proxy.$Proxy45。
spring 如何使它成为线程安全的读取?
【问题讨论】:
-
它注入实际对象的代理并在需要时进行查找(实际请求绑定到当前执行线程)。但是为什么要注入
HttpServletRequest?您可以简单地将它作为参数添加到您的方法中。我认为后者是一种比注入它更好的方法。 -
谢谢,我是这么认为的。它的工作原理很有趣。
标签: java spring spring-mvc