Spring的Controller是怎么保证并发的安全
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,Spring的Controller是怎么保证并发的安全,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Controller 默认是单例
千家信息网最后更新 2025年02月03日Spring的Controller是怎么保证并发的安全
Spring的Controller是怎么保证并发的安全,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
Controller 默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。
我们下面来简单的验证下:
package com.xttblog.springbootdemo.controller;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author 业余草,公众号
*/
@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.xttblog.springbootdemo.controller;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author 业余草,公众号
*/
@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。
相信大家不难发现:
❝单例是不安全的,会导致属性重复使用。
❞
解决方案
不要在 Controller 中定义成员变量。 万一必须要定义一个非静态成员变量时候,则通过注解 @Scope("prototype"),将其设置为多例模式。 在 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。
关于Spring的Controller是怎么保证并发的安全问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
安全
变量
答案
作用
实例
成员
模式
问题
保证
不同
接下来
公众
就是
新产
时候
更多
线程
静态
帮助
管理
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
oa系统在云服务器安全吗
数据库表跟元组
辽宁专业软件开发服务价钱
网络安全和信息化内容
软件开发公司做手脚坑钱
T6数据库中已存在名为
公安局网络技术支队
查数据库所有的表oracle
一般云服务器的内存
补丁服务器下载
软件开发质量手册
云端数据库英文
如何建立数据库式表格
NSS下载软件开发
舆情算不算网络安全
广东省网络安全专业研究生
移动单线服务器
小学网络安全活动班队会方案
数据库逻辑运算规则
手机连接代理服务器
数据库系统_文件系统
数据库加密和保护
多媒体sip服务器搭建
战地1如何选择自定义服务器
南汇软件开发专业
服务器和子机怎么连接
数据库解压版下载
关于网络安全的网文
鲸准java软件开发实习转正
邯郸企业软件开发哪家实惠