全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解Spring Controller autowired Request变量

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


相关文章: 网站制作需要会哪些技术,建立一个网站要花费多少?  焦点电影公司作品,电影焦点结局是什么?  建站三合一如何选?哪家性价比更高?  大型企业网站制作流程,做网站需要注册公司吗?  黑客如何利用漏洞与弱口令入侵网站服务器?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  浅析上传头像示例及其注意事项  建站之星多图banner生成与模板自定义指南  网页设计网站制作软件,microsoft office哪个可以创建网页?  建站之星上传入口如何快速找到?  如何通过宝塔面板实现本地网站访问?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  如何快速生成专业多端适配建站电话?  如何用低价快速搭建高质量网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  常州自助建站工具推荐:低成本搭建与模板选择技巧  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  如何选择靠谱的建站公司加盟品牌?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  IOS倒计时设置UIButton标题title的抖动问题  建站主机服务器选型指南与性能优化方案解析  网站制作企业,网站的banner和导航栏是指什么?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  自助网站制作软件,个人如何自助建网站?  建站之星备案流程有哪些注意事项?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  宝塔新建站点报错如何解决?  如何确保西部建站助手FTP传输的安全性?  已有域名如何快速搭建专属网站?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  建站168自助建站系统:快速模板定制与SEO优化指南  建站之星如何实现PC+手机+微信网站五合一建站?  北京制作网站的公司,北京铁路集团官方网站?  表情包在线制作网站免费,表情包怎么弄?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  如何选择适配移动端的WAP自助建站平台?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  如何使用Golang table-driven基准测试_多组数据测量函数效率  如何打造高效商业网站?建站目的决定转化率  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  建站之星好吗?新手能否轻松上手建站?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何通过商城免费建站系统源码自定义网站主题?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  C++如何编写函数模板?(泛型编程入门)  建站主机SSH密钥生成步骤及常见问题解答?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  香港服务器如何优化才能显著提升网站加载速度?  南平网站制作公司,2025年南平市事业单位报名时间?  C#怎么使用委托和事件 C# delegate与event编程方法 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。