zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ny2 括号配对问题
    ny14 会场安排问题
    杭电ACM题目分类
    hdoj2037 今年暑假不AC
    ny37 回文字符串
    算法 字符串的排列组合
    手撸IoC
    Java设计模式
    多种方法求java求整数的位数
    二叉树之 二叉树深度
  • 原文地址:https://www.cnblogs.com/voctrals/p/9168978.html
Copyright © 2011-2022 走看看