码迷,mamicode.com
首页 > 编程语言 > 详细

springmvc中的单例问题

时间:2018-06-11 22:03:36      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:conf   tps   span   singleton   ring   word   响应   调整   程序   

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

springmvc中的单例问题

标签:conf   tps   span   singleton   ring   word   响应   调整   程序   

原文地址:https://www.cnblogs.com/voctrals/p/9168978.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!