详解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使用了很聪明的办法

  1. 首先request和用户请求相关
  2. 不同的用户同时访问时是在不同的线程中
  3. 保存了用户的请求在threadlocal中
  4. 用户获取该请求需要手动调用threadlocal来获取
  5. 为了帮助用户减少重复代码,spring可以让用户‘动态'注入request
  6. 当controller在实例化时,动态注册一个proxy到当前request变量中
  7. 此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示例)