详解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


相关推荐: uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  浅谈javascript alert和confirm的美化  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  什么是javascript作用域_全局和局部作用域有什么区别?  如何确保西部建站助手FTP传输的安全性?  香港服务器WordPress建站指南:SEO优化与高效部署策略  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  教学论文网站制作软件有哪些,写论文用什么软件 ?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Python结构化数据采集_字段抽取解析【教程】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  JS中对数组元素进行增删改移的方法总结  详解Android中Activity的四大启动模式实验简述  Laravel如何创建自定义Artisan命令?(代码示例)  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Python进程池调度策略_任务分发说明【指导】  Laravel如何实现文件上传和存储?(本地与S3配置)  如何为不同团队 ID 动态生成多个非值班状态按钮  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何快速搭建高效WAP手机网站吸引移动用户?  在线教育网站制作平台,山西立德教育官网?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  如何快速上传建站程序避免常见错误?  Linux网络带宽限制_tc配置实践解析【教程】  高端建站如何打造兼具美学与转化的品牌官网?  Laravel如何实现事件和监听器?(Event & Listener实战)  黑客如何利用漏洞与弱口令入侵网站服务器?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Windows Hello人脸识别突然无法使用  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  如何在万网主机上快速搭建网站?  如何快速生成凡客建站的专业级图册?  如何破解联通资金短缺导致的基站建设难题?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?