详解Spring Controller autowired Request变量
发布时间 - 2026-01-11 02:53:56 点击率:次详解Spring Controller autowired Request变量

spring的DI大家比较熟悉了,对于依赖注入的实现也无须赘述。
那么spring的bean的默认scope为singleton,对于controller来说每次方法中均可以获得request还是比较有意思的。
对于方法参数上的request通过构建方法的参数可以获得最新的request
public final Object invokeForRequest(NativeWebRequest request, ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
if (logger.isTraceEnabled()) {
StringBuilder sb = new StringBuilder("Invoking [");
sb.append(getBeanType().getSimpleName()).append(".");
sb.append(getMethod().getName()).append("] method with arguments ");
sb.append(Arrays.asList(args));
logger.trace(sb.toString());
}
Object returnValue = invoke(args);
if (logger.isTraceEnabled()) {
logger.trace("Method [" + getMethod().getName() + "] returned [" + returnValue + "]");
}
return returnValue;
}
2. 对于controller等单实例变量来说如何动态注入变量呢?spring使用了很聪明的办法
- 首先request和用户请求相关
- 不同的用户同时访问时是在不同的线程中
- 保存了用户的请求在threadlocal中
- 用户获取该请求需要手动调用threadlocal来获取
- 为了帮助用户减少重复代码,spring可以让用户‘动态'注入request
- 当controller在实例化时,动态注册一个proxy到当前request变量中
- 此proxy当被使用是可以将所有方法动态路由到threadlocal中该request变量上执行
/**
* Register web-specific scopes ("request", "session", "globalSession", "application")
* with the given BeanFactory, as used by the WebApplicationContext.
* @param beanFactory the BeanFactory to configure
* @param sc the ServletContext that we're running within
*/
public static void registerWebApplicationScopes(ConfigurableListableBeanFactory beanFactory, ServletContext sc) {
beanFactory.registerScope(WebApplicationContext.SCOPE_REQUEST, new RequestScope());
beanFactory.registerScope(WebApplicationContext.SCOPE_SESSION, new SessionScope(false));
beanFactory.registerScope(WebApplicationContext.SCOPE_GLOBAL_SESSION, new SessionScope(true));
if (sc != null) {
ServletContextScope appScope = new ServletContextScope(sc);
beanFactory.registerScope(WebApplicationContext.SCOPE_APPLICATION, appScope);
// Register as ServletContext attribute, for ContextCleanupListener to detect it.
sc.setAttribute(ServletContextScope.class.getName(), appScope);
}
beanFactory.registerResolvableDependency(ServletRequest.class, new RequestObjectFactory());
beanFactory.registerResolvableDependency(HttpSession.class, new SessionObjectFactory());
beanFactory.registerResolvableDependency(WebRequest.class, new WebRequestObjectFactory());
if (jsfPresent) {
FacesDependencyRegistrar.registerFacesDependencies(beanFactory);
}
}
/**
* Factory that exposes the current request object on demand.
*/
@SuppressWarnings("serial")
private static class RequestObjectFactory implements ObjectFactory<ServletRequest>, Serializable {
public ServletRequest getObject() {
return currentRequestAttributes().getRequest();
}
@Override
public String toString() {
return "Current HttpServletRequest";
}
}
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Spring
# Controller
# autowired
# Request变量
# Request变量的实例详解
# 如何在springMVC的controller中获取request
# 关于Spring MVC在Controller层中注入request的坑详解
# Spring实现在非controller中获取request对象
# 可以获得
# 是在
# 如有
# 希望能
# 谢谢大家
# 很聪明
# 存了
# 疑问请
# 中均
# 有意思
# 使用了
# arguments
# method
# getName
# asList
# Arrays
# trace
# getMethod
# Invoking
# sb
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
制作公司内部网站有哪些,内网如何建网站?
怎么用AI帮你为初创公司进行市场定位分析?
如何用y主机助手快速搭建网站?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
如何做网站制作流程,*游戏网站怎么搭建?
大连 网站制作,大连天途有线官网?
如何在阿里云完成域名注册与建站?
如何快速选择适合个人网站的云服务器配置?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Laravel如何使用Livewire构建动态组件?(入门代码)
在线教育网站制作平台,山西立德教育官网?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
如何生成腾讯云建站专用兑换码?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Android 常见的图片加载框架详细介绍
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Android GridView 滑动条设置一直显示状态(推荐)
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何有效防御Web建站篡改攻击?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
高端建站如何打造兼具美学与转化的品牌官网?
如何在腾讯云免费申请建站?
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
如何用景安虚拟主机手机版绑定域名建站?
JavaScript数据类型有哪些_如何准确判断一个变量的类型
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
高防服务器如何保障网站安全无虞?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
微信小程序 input输入框控件详解及实例(多种示例)
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
JS弹性运动实现方法分析
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
如何在万网ECS上快速搭建专属网站?
Laravel如何使用.env文件管理环境变量?(最佳实践)
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel如何使用Telescope进行调试?(安装和使用教程)
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
大型企业网站制作流程,做网站需要注册公司吗?
如何确保西部建站助手FTP传输的安全性?
Laravel如何实现一对一模型关联?(Eloquent示例)

