2019独角兽企业重金招聘Python工程师标准>>>

spring mvc 的Controller类默认Scope是单例(singleton)的

使用Spring MVC有一段时间了,之前一直使用Struts2,在struts2中action都是原型(prototype)的, 说是因为线程安全问题,对于Spring MVC中bean默认都是(singleton)单例的,那么用@Controller注解标签注入的Controller类是单例实现的?

测试结果发现spring3中的controller默认是单例的,若是某个controller中有一个私有的变量i,所有请求到同一个controller时,使用的i变量是共用的,即若是某个请求中修改了这个变量a,则,在别的请求中能够读到这个修改的内容。 若是在@Controller之前增加@Scope(“prototype”),就可以改变单例模式为多例模式

以下是测试步骤,代码与结果.

1. 如果是单例类型类的,那么在Controller类中的类变量应该是共享的,如果不共享,就说明Controller类不是单例。以下是测试代码:

 
  1. import javax.servlet.http.HttpServletRequest;

  2. import javax.servlet.http.HttpServletResponse;

  3. import org.springframework.stereotype.Controller;

  4. import org.springframework.web.bind.annotation.RequestMapping;

  5. import org.springframework.web.bind.annotation.ResponseBody;

  6. @Controller

  7. public class ExampleAction {

  8. private int singletonInt=0;

  9. @RequestMapping(value = "/test")

  10. @ResponseBody

  11. public String singleton(HttpServletRequest request,

  12. HttpServletResponse response) throws Exception {

  13. String data=request.getParameter("data");

  14. if(data!=null&&data.length()>0){

  15. try{

  16. int paramInt= Integer.parseInt(data);

  17. singletonInt = singletonInt + paramInt;

  18. }

  19. catch(Exception ex){

  20. singletonInt+=10;

  21. }

  22. }else{

  23. singletonInt+=1000;

  24. }

  25. return String.valueOf(singletonInt);

  26. }

  27. }

分别三次请求: http://localhost:8080/example/test.do?data=15

得到的返回结果如下。

第一次: singletonInt=15

第二次: singletonInt=30

第三次: singletonInt=45

从以上结果可以得知,singletonInt的状态是共享的,因此Controller是单例的。

2. 如果Controller类是单例,那么多个线程请求同一个Controller类中的同一个方法,线程是否会堵塞

 
  1. @RequestMapping(value = "/sleepdata")

  2. @ResponseBody

  3. public String switcher(HttpServletRequest request

  4. , HttpServletResponse response)

  5. throws Exception {

  6. String sleep = request.getParameter("sleep");

  7. if (sleep.equals("on")) {

  8. Thread.currentThread().sleep(100000);

  9. return "sleep on";

  10. } else {

  11. return sleep;

  12. }

  13. }

验证方法:分别发送两个请求,

第一个请求:http://localhost:8080/coreplat/sleepdata.do?sleep=on

第二个请求:http://localhost:8080/coreplat/sleepdata.do?sleep=test

验证结果:第一个请求发出去以后,本地服务器等待100s,然后返回结果”sleep on”,在本地服务器等待的者100s当中,发送第二个请求,直接返回结果”test”。说明之间的线程是不互相影响的。

转载于:https://my.oschina.net/wangen2009/blog/2251217

spring的controller是单例模式,但是是多线程,各个线程之间不影响相关推荐

  1. python—多线程之线程之间共享数据(Queue)

    一.Queue理解 从一个线程向另一个线程发送数据最安全的方式可能就是使用queue库中的队列了.创建一个被多个线程共享的Queue对象,这些线程通过使用put()和get()操作来向队列中添加或者删 ...

  2. 多线程:线程之间的协作(join、wait、notify、notifyAll、await、signal、signalAll)

    当多个线程可以一起工作去解决某个问题时,如果某些部分必须在其它部分之前完成,那么就需要对线程进行协调. join() 在线程中调用另一个线程的 join() 方法,会将当前线程挂起,而不是忙等待,直到 ...

  3. java不同进程的相互唤醒_JAVA多线程之线程间的通信方式

    一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...

  4. java多线程方式轮询,深入理解JAVA多线程之线程间的通信方式

    一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...

  5. java注解返回不同消息,Spring MVC Controller中的一个读入和返回都是JSON的方法如何获取javax.validation注解的异常信息...

    Spring MVC Controller中的一个读入和返回都是JSON的方法怎么获取javax.validation注解的错误信息? 本帖最后由 LonelyCoder2012 于 2014-03- ...

  6. Spring MVC Controller 要点

    2019独角兽企业重金招聘Python工程师标准>>> 今天看到一篇讲解 Spring MVC Controller 的文章,比较详细,顺道翻译下. 在 Spring MVC 中,我 ...

  7. Spring中@Controller和@RestController之间的区别

    1. Controller, RestController的共同点 都是用来表示Spring某个类的是否可以接收HTTP请求 2.  Controller, RestController的不同点 @C ...

  8. Spring MVC Controller中返回json数据中文乱码处理

    问题 在使用spring MVC Controller的过程中,发现返回到客户端的的中文出现乱码.后台Java代码: @RequestMapping(value = "/upload&quo ...

  9. Spring MVC Controller与jquery ajax请求处理json

    在用 spring mvc 写应用的时候发现jquery传递的[json数组对象]参数后台接收不到,多订单的处理,ajax请求: var cmd = {orders:[{"storeId&q ...

最新文章

  1. 取代INT 80 的sysenter/sy***it
  2. 网络推广下叮咚买菜已完成D轮融资,生鲜电商下一次融资又在何方?
  3. LeetCode OJ - Copy List with Random Pointer
  4. Linux UOS(国产统信)系统下Qt无法打印日志的问题
  5. 数据结构 - 二叉树 - 面试中常见的二叉树算法题
  6. 在使用angularjs过程,ng-repeat中track by的作用
  7. 调查了9648位Go用户:吐槽最多的竟是官方文档!
  8. Python之通过url抓取pickle文件
  9. 深度学习2.0-24.过拟合与欠拟合
  10. LODOP批量打印多页模版进行维护
  11. 【opencv】visualstudio实现opencvblobslib编译
  12. CentOS7.x忘记root密码如何破解
  13. A simple brute force problem.
  14. 支持html签名的邮箱app,在iPhone和iPad上创建使用丰富的HTML电子邮件签名 | MOS86
  15. 微信公众号视频下载教程
  16. 市面上4.4V截止电压的锂电充电IC有哪些呢
  17. java 毫秒转分钟和秒_将毫秒转换为分钟和秒的java程序
  18. 塞班3的java键盘_【图片】Symbian3系统简介【塞班3吧】_百度贴吧
  19. loadrunner icrosoft Visual c++2005 sp1运行时组件,就会提示命令行选项语法错误,键入“命令/?”
  20. MFC隐藏窗口时解决窗口闪烁问题

热门文章

  1. pt-archiver 数据归档bug
  2. 工信部印发《信息安全产业“十二五”发展规划》
  3. matplotlib - ax.bar()ax.pie()
  4. 大型互联网公司分布式ID方案总结
  5. ⼤海捞针 —— Scan
  6. 2019.04.06 电商04 模板嵌套
  7. Nginx下完美解决WordPress的伪静态 (wordpress 迁移后 导致 页面404)
  8. 逆元+费马小定理+扩展欧几里得
  9. Django进阶Model篇—数据库操作(ORM)
  10. 页面的div中有滚动条,js实现刷新页面后回到记录时滚动条的位置