Controller 是单例还是多例?怎么保证并发的安全
答案:
controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。
我们下面来简单的验证下:
package com.riemann.springbootdemo.controller;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author riemann* @date 2019/07/29 22:56*/
@Controller
public class ScopeTestController {private int num = 0;@RequestMapping("/testScope")public void testScope() {System.out.println(++num);}@RequestMapping("/testScope2")public void testScope2() {System.out.println(++num);}}
我们首先访问 http://localhost:8080/testScope,得到的答案是1;然后我们再访问 http://localhost:8080/testScope2,得到的答案是 2。
得到的不同的值,这是线程不安全的。
接下来我们再来给controller增加作用多例 @Scope("prototype")
package com.riemann.springbootdemo.controller;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author riemann* @date 2019/07/29 22:56*/
@Controller
@Scope("prototype")
public class ScopeTestController {private int num = 0;@RequestMapping("/testScope")public void testScope() {System.out.println(++num);}@RequestMapping("/testScope2")public void testScope2() {System.out.println(++num);}}
我们依旧首先访问 http://localhost:8080/testScope,得到的答案是1;然后我们再访问 http://localhost:8080/testScope2,得到的答案还是 1。
相信大家不难发现 :
单例是不安全的,会导致属性重复使用。
推荐一个DD写的SpringBoot基础教程:
http://blog.didispace.com/spring-boot-learning-2x/
解决方案
1、不要在controller中定义成员变量。2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式。3、在Controller中使用ThreadLocal变量
补充说明
spring bean作用域有以下5个:
singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以避免预处理;
prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;
(下面是在web项目下才用到的)
request:搞web的大家都应该明白request的域了吧,就是每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听;
session:每次会话,同上;
global session:全局的web域,类似于servlet中的application。
Controller 是单例还是多例?怎么保证并发的安全相关推荐
- SpringMVC Controller单例和多例
对于SpringMVC Controller单例和多例,下面举了个例子说明下. 第一次:类是多例,一个普通属性和一个静态属性. 结果:普通属性:0.............静态属性:0 普通属性:0. ...
- SpringMVC中的Controller默认单例
众所周知,Servlet是单例的. 在struts中,Action是多例的,每一个请求都会new出来一个action来处理. 在Spring中,Controller默认是单例的,多个请求都会访问同一个 ...
- 设计模式C#描述——单例与多例模式
设计模式C#描述--单例与多例模式 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有以下特点: 单例类只能有一个实例. 单例 ...
- Spring(07)——单例注入多例之lookup-method
2019独角兽企业重金招聘Python工程师标准>>> Spring(07)--单例注入多例之lookup-method 博客分类: spring 7 单例注入多例之lookup-m ...
- 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式
设计模式C#描述之--简单工厂模式 前 言:设计模式是软件开发领域的精髓之一.学好设计模式是目前每一个开发人员的必修课.目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并 不很适合初学者 ...
- Spring中bean的单例与多例
Spring中bean的单例与多例 前言 Spring中单例与多例 如何配置单例/多例 单例/多例Bean的使用事项 总结 前言 之前其实已经学习过对于单例模式的使用单例模式讲解,也用过一段时间的Sp ...
- Java面向对象(接口、匿名内部类、object类、单例、多例)
1.1接口(抽象类与接口,优先使用接口) 抽象方法和全局常量的集合,使用interface定义,使用implements继承 接口可以多继承(可以向上强制转换) 接口只能有public,一般不写常量 ...
- java中单例和多例
你用杯子喝可乐,喝完了不刷,继续去倒果汁喝,就是单例. 你用杯子喝可乐,直接扔了杯子,换个杯子去倒果汁喝,就是多例. 数据库连接池就是单例模式,有且仅有一个连接池管理者,管理多个连接池对象. 1. 什 ...
- 多目标柔性车间调度丨NSGA-II:以算例MK01为例
车间调度系列文章: 1.车间调度的编码.解码,调度方案可视化的探讨 2.多目标优化:浅谈pareto寻优和非支配排序遗传算法-NSGAII的非支配排序及拥挤度 3.柔性车间调度问题:以算例MK01初探 ...
- Scala-Unit6-final/type关键字、样例类样例对象
一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...
最新文章
- 复习计算机网络基础 day9--应用层
- python中封装、继承、多态
- [转]autoid文件上传
- 利用OpenCV实现图像拼接的代码
- python学习_22(文件)
- WORD中怎么把文字转换成表格
- The Genymotion virtual device could not obtain an IP address
- 详解java集合之LinkedList——底层实现是头尾、双向节点,尽情地问我有没有看过集合源码吧!
- 为什么构造函数不能是虚函数
- WEB Service 下实现大数据量的传输
- 多核Cache一致性 伪共享 atomic的实现和cache相关的部分
- visual svn server安装失败
- yii2 php7 mongodb,Yii2中MongoDB的使用方法-CURD
- Layui文件上传样式在ng-dialog不显示的问题处理
- 【优化布局】基于粒子群算法求解带出入点的车间布局优化问题附matlab代码
- ZOJ 3551 Bloodsucker 题解
- java发送带格式邮件及带多附件
- C语言基础第五次作业
- TortoiseGit提示No supported authentication methods available异常
- 给大家推荐几款简洁实用电脑软件!
热门文章
- 会说话的狗狗本电脑版_会说话的电脑有点酷!惠普星14帮你解锁“偷懒”新姿势_惠普 星 14 2020(i5 1135G7/16GB/512GB/MX450)_笔记本新闻...
- 如何理解Memory leak
- go语言json的使用技巧
- stc51单片机怎么学, 先掌握STC单片机程序烧录方法
- vb科学计算机x y,vb程序用vb实现系统的计算器功能1/x,sqrt,%,+/-, 爱问知识人
- 第4关:非递归实现二叉树左右子树交换
- 树形dp ---- gym101655 D - Delta Quadrant 树上连通块思维换根 + 树形dp
- Luogu P4178 Tree (点分治 + 树状数组)
- POJ2932Coneology(计算几何、平面扫描)
- 【每日DP】day6 P1541 乌龟棋(四维DP)难度⭐⭐⭐