为什么在SpringMVC和SpringBoot中可以直接注入HttpServletRequest
如题:为什么在SpringMVC和SpringBoot中可以直接注入HttpServletRequest对象。
代码示例
@Autowired
private HttpServletRequest request;
@GetMapping(value = "/rest/current")
public ReturnResult current() {
System.out.println(request.getRequestURL().toString());
JSONObject res = new JSONObject();
res.put("requestId", UUID.randomUUID().toString());
res.put("datatime", DateUtils.getDatetime());
return ReturnResult.get(res);
}
理论上,我们需要注入其他包中的对象的时候,是必须在@Configuration修饰的类下面使用@Bean进行方法修饰的才行的,如下所示:
@Configuration
public class ApplicationConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
那为什么HttpServletRequest这个对象如此优秀,可以直接注入呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
它这么秀的根本原因是因为……注入的并不是真正的 HttpServletRequest,只是一个代理对象,其背后的核心对象是
org.springframework.web.context.support.WebApplicationContextUtils.RequestObjectFactory
你看这个类长啥样:
那这个“当前 ServletRequest”从哪来呢?
Servlet 除了
ServletContextListener
之外,还有一个ServletRequestListener
:只要你注册了这个,就能在请求前执行
requestDestroyed
Spring 弄了一个
org.springframework.web.context.request.RequestContextListener
,在这个里面获取并存储的特殊情况特殊处理。不要把ioc死板的搬过来。
Request, Response, HttpEntity等都是特殊处理的。而且这几个对象和请求有关,不在窗口里面。
请看这里:https://blog.csdn.net/guo_xl/...