最近看了下之前项目的代码,发现有同事写了类似如下的代码结构:
1、控制层
@RestController
public class TestController {
@Autowired
private ITestBizc testBizc;
@ModelAttribute
public void init(HttpServletRequest request){
testBizc.setRequest(request);
}
}
2、业务层
@Repository
public class TestBizc implements ITestBizc {
private HttpServletRequest httpServletRequest;
@Override
public void setRequest(HttpServletRequest httpServletRequest) {
this.httpServletRequest = httpServletRequest;
}
}
HttpServletRequest对象代表客户端的请求,这边的操作目的是为了从控制层传request对象到业务层,并利用@ModelAttribute,使得每个请求方法都先执行传值操作。我们先不讨论其他的做法,就单纯看这样做会导致什么问题。
Spring默认设置每个bean都是单例的,这意味着每个request过来,系统都会用原有的实例去处理 ,这样可以减少对象的创建与垃圾回收的消耗,但是这也就带来了另外一个问题,共享变量的线程安全性问题。就上面的例子而言,我们发现TestBizc将HttpServletRequest设置成