• springmvc中的单例问题


    1,springmvc实际上是基于一个叫做DispatcherServlet的servlet的。servlet按照以往的学习经验,他是单事例多线程的。

    Servlet生命周期

    1.装载Servlet。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet。
    2.Server创建一个Servlet的实例
    3.Server调用Servlet的init()方法
    4.一个客户端的请求到达Server
    5.Server创建一个请求对象
    6.Server创建一个响应对象
    7.Server激活Servlet的service()方法,传递请求和响应对象作为参数
    8.service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
    9.service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法。
    10.对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。一般Servlet只初始化一次(只有一个对象),当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法。

    2,springmvc中的@Controller,@Service等默认是单例的(ConfigurableBeanFactory#SCOPE_SINGLETON),多线程的。

    3,如果在@Controller中存在实例变量的话,这个实例变量是被多个线程共享的,,造成线程不安全。所以不可避免的使用实例变量的时候,①,调整scope为ConfigurableBeanFactory#SCOPE_PROTOTYPE,②,将变量修饰为LocalThread。

    4,最重要的一点,今天一同事说道,可以在controller中对访问作限流。我很诧异,不应该在Controller之前作限流吗?

    他给出的解释为:Controller默认是单例的,并不是说会初始化很多个,而是所有的线程使用这一个,get√,声明一个局部变量Semphare,最大值为限流的大小即可。

    十分感谢他。

    DispatcherServlet
  • 相关阅读:
    APS.NET MVC + EF (14)---项目框架搭建
    APS.NET MVC + EF (11)---过滤器
    APS.NET MVC + EF (10)---使用AJAX
    APS.NET MVC + EF (06)---模型
    APS.NET MVC + EF (08)---数据注解和验证
    APS.NET MVC + EF (07)---表单和HTML辅助方法
    APS.NET MVC + EF (05)---控制器
    错误 1 error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    VS2010中项目配置引入GDAL
    Win7(32/64)VS2010配置编译GDAL环境(图文教程+亲测可用!)
  • 原文地址:https://www.cnblogs.com/voctrals/p/9168978.html
Copyright © 2020-2023  润新知