Spring MVC不要在@Service bean中保存状态

unity shader 后处理实现水墨风格渲染「Low Poly 」变「水墨画 」 水墨风格渲染 这次学校的比赛打算做一个中国古代背景的游戏,所以尝试做了水墨风格的渲染。 主要按以下四步来实现的效果: 根据色调和饱和度调整饱和度。 对图像进行模糊 水墨风格的物体边缘 物体内画笔笔触的模拟 接下来我分别就这四步依次展开说明: 调整饱和度 这里我使用Post-Processing Stack 的Color Grading 来调节饱和度,通过使用Grading Curv... 阅读详情

先看这么一段代码:

@Service
public class AccountService {
	private String message;
	
	public void foo1() {
		if (true) {
			this.message = "a";
		} else {
			this.message = "b";
		}
	}
	
	public void foo2() {
		// 修改this.message的代码...
		// ... ...
	}
}

如果你打算在@Controller里这么调用AccountService : 

accountService.foo1();
		model.addAttribute(accountService.getMessage());

那么就有线程安全的危险了。


问题原因

在Spring中,bean的默认scope是singleton,也就是说容器中只有一个bean的实例。而在Java Web环境中,web服务器会为每一个请求创建一个线程来处理它。这样一来,在@Controller中调用@Service bean的方法就会导致有多个线程在执行@Service方法,例如线程A在执行foo1()方法,线程B在执行foo2()方法。那么问题来了,多个线程同时读写message成员变量,就可能让getMessage()方法返回错误的值

解决方法

1. 将@Service bean的scope改为 "request",即:
@Service
@Scope("request")
public class AccountService {
	private String message;

这样Spring会为每一个请求分别创建一个AccoutService对象,每个线程都有自己的message变量,就不会出错了。但坏处是创建@Service bean的开销往往比较大,会导致程序性能下降。

2. 使用不可变对象(Immuable Object)封装message变量
定义如下类:
class MessageWrapper {
	private String message;
	
	public MessageWrapper(String msg) {
		this.message = msg;
	}
	
	// 只提供get方法
	public String getMessage() {
		return this.message;
	}
}

AccountService的foo1()方法修改如下:
@Service
public class AccountService {
	public MessageWrapper foo1() {
		if (true) {
			return new MessageWrapper("a");
		} else {
			return new MessageWrapper("b");
		}

		// ... ...
	}

这样便可以完美避免线程安全问题,又不会带来过多的额外开销。
【HAL库】STM32CubeMX开发----STM32F407----ETH+LAN8720A+LWIP----ping通 本次实验以芯片为MCU,使用25MHz外部时钟源。以太网PHY层芯片为LAN8720A,由MCU引脚PA8提供时钟。 阅读详情

相关推荐

海康VM加密狗无法识别常见问题排查

海康VM加密狗无法识别常见问题排查

视觉人机器视觉的博客 2695

【Android 一般进阶】不建议在Service以及BroadcastReceive startActivity

在谷歌官方的API文档中,特别建议开发者不要在Service以及BroadcastReceive startActivity,这是为了防止在用户完全不知情的情况下,突然弹出一个页面中断了他的操作。 在   http://developer.android.com/guide/practices/seamlessness.html#interrupt  中有如下解释: That is,

ben0612的专栏 1440

实战游戏项目管理1-规划篇

1、前言 做研发管理10多年,进游戏行业8年,经验下来项目管理就是一门技术,结合不同行业不同项目加以不同管理方法,但原理基本一样,这里总结下游戏项目的管理一些实操方法 一般游戏确定立项前都需要做,项目预研产出一个游戏Demo,通过公司的立项评审,这个过程的项目管理相对简单一般由制作人或其他项目经理兼任,只有控制好总体时间与成本就好,这里按立项后开始讲。 2、游戏项目规划 ...

pengdali的专栏 2万+

不要在service层try....catch...

在服务层(service)try …catch …后,如果不抛异常的话,服务器会认为正常,不报错.

weixin_43102313的博客 2636

基因家族快速鉴定指南:Windows平台下的HMMER实战解析

本文详细解析了在Windows平台下使用HMMER工具进行基因家族快速鉴定的完整实战流程。通过手把手指导,从软件获取、数据准备到模型构建与序列搜索,帮助生物信息学新手无需Linux环境,即可高效完成bZIP转录因子等家族的鉴定工作,大幅降低分析门槛。

weixin_29255731的博客 453

再生龙(clonezilla)镜像比目标盘大——基于centos8.5

再生龙恢复到小盘遇到的问题及处理,首先是修改分区大小,进入dracut模式后再尝试恢复临时系统。

u010101453的博客 3686

【Spring】-Spring中Bean对象的存取

往spring中存储Bean对象的三大方式:XML方式(Bean标签);五大类注解;方法注解。从spring中取对象的两种方式:基本方法、注解方法(属性注入、set注入、构造方法注入)。

m0_63979882的博客 1959

实战教程:如何用Python+小波变换+CNN搞定医学影像中的条纹噪声(附完整代码)

本文提供了一套完整的实战方案,指导如何利用Python结合小波变换与卷积神经网络(CNN)去除医学影像中的条纹噪声。该方法通过小波变换精准定位噪声,再使用轻量化CNN进行针对性清除,有效保护图像细节,并附有可运行的完整代码,为医学影像处理与AI分析提供高效工具。

weixin_29056101的博客 267

spring 源码笔记 spring启动过程(概括篇)

何为spring容器 理论级别解释:由多个spring组件组成的应用程序叫spring容器。 代码级别解释:所有实现ApplicationContext接口的类都是spring容器。 如何得到一个普通对象 简单描述:.java —> class —> object 详细描述:创建.java文件 —> 编译得到.class文件 —> JVM加载到方法区得到class对象 —&...

TBryant的博客 515

【AUTOSAR-CanNM】-3.1-如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

「汽车电子助手」的博客 4723

Qt Quick/QML入门到精通_专栏demo对应文章目录(目前50个左右demo/长期更新)

自定义图标下拉列表框的效果如下所示:自定义三态按钮的效果如下所示:传送门:53.qt quick-自定义三态按钮、自定义图标下拉列表框_诺谦的博客-优快云博客传送门:59.qt quick-qml调色板(颜色取色器)实现、自定义QQuickStyle样式_诺谦的博客-优快云博客63.qt quick-QML侧边滑动栏(不需要任何图片资源,支持自定义左右方向和大小)_诺谦的博客-优快云博客_qt实现好看侧边栏。...

抵抗时间扭曲,坚持做一件有意义的事 2万+

springMVC一个Controller处理所有用户请求的并发问题

springMVC一个Controller处理所有用户请求的并发问题 有状态和无状态的对象基本概念: 有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。一般是prototype scope。无状态对象(Stateless Bean),就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。一般是singleton scope。 如...

iteye_8039的博客 5120

电机驱动和电源等大电流设计中的并联 MOSFET设计

在电机驱动等应用中,半桥拓扑(通常为 3 相)用于生成在电机中产生正扭矩或负扭矩的交流电源信号。想要更高的输出电流能力,只有通过并联形成每个功能开关的 MOSFET,才能实现高输出电流。当多个功率 MOSFET 并联以增加系统整体电流能力容量时,通常假设电流在并联器件之间均等分配或均等共享。然而,在并联 MOSFET 时,需要考虑并联器件之间的电流分配。PCB 布局的若干特性和特定的MOSFET 参数会影响这种分配,并在参数不匹配或布局不对称时导致均流不平衡。

小幽余生不加糖 2484

第二章 Spring中的Bean

1、以下有关Bean的singleton作用域说法错误的是()。 A、prototype是Spring容器默认的作用域 B、对需要保持会话状态的Bean(如Struts2的Action类)应该使用prototype作用域 C、在使用prototype作用域时,Spring容器会为每个对该Bean的请求都创建一个新的实例 D、要将Bean定义为prototype作用域,只需在配置文件中将元素的scope属性值设置为prototype即可 参考答案 :A 2、以下有关Bean的装配方式说法正确的是()。 A、S

weixin_46066900的博客 8494

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spring Bean的作用域和生命周期

介绍Spring Bean的6种作用域,Bean的生命周期,会基于xml配置文件的方式和注解实现方式在程序中演示生命周期的过程。

trong_ 的烂笔头 2636

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

@Controller、@Service、@Component 的关系与区别

💡 注解继承关系: @Controller → @Component @Service → @Component。

m0_75107803的博客 1490

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2023年JAVA面试题【Spring/Spring MVC】

aop 是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。ioc:Inversionof Control(中文:控制反转)是 spring 的核心,对于 spring 框架来说,就是由spring 来负责控制对象的生命周期和对象间的关系。简单来说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理了,由其他(类,第三方容器)来管理。

a88137的博客 363

Spring bean

Spring Spring的核心机制 管理Bean 程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类: ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。 FileSystemXmlApplicationContext: 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器 public cla

sunjiac的博客 173

spring bean scope 的几种类型

Spring容器最初提供了两种bean的scope类型:singleton和prototype,但发布2.0以后,又引入了另外三种scope类型:request、session和global session,这三种只能在web 应用中才可以使用。   singleton: Spring 容器只会创建该bean定义的唯一实例,这个实例会被保存到缓存中,并且对该bean的所有后续请求和引用

kris的杀手之路 9020

Spring中的Bean

生命周期托管:容器统一管理对象的创建、初始化和销毁,减少手动代码。依赖自动注入:通过 DI 机制解除对象间的硬耦合,提高代码灵活性。作用域灵活控制:根据业务需求选择单例、原型等作用域,优化资源使用。理解 Bean 的特性和管理机制,是掌握 Spring 框架的基础,也是实现松耦合、高可维护性应用的关键。

2502_92141759的博客 956

Spring MVC和Spring Boot

并且使用@bean注解时,bean的名称必需是类名,否则不能找到对应的bean对象。

zhimeng3的博客 1648

Spring Bean管理

1、Spring框架的核心是Spring容器。 2、Spring装配Bean的3种主要方案

yio_yin的专栏 200

Spring框架最全面试题集——Spring Framework、Spring MVC、Spring Boot

包含Spring Framework, SpringBoot, SpringMVC,从入门到深入理解底层原理,Java面试必备

mo_chen1025的博客 1462

Spring框架中的Bean是线程安全的吗?

在Java开发中,Spring框架是一个广泛使用的轻量级控制反转(IoC)和面向切面(AOP)容器框架。它简化了企业级应用的开发,提供了丰富的功能,如依赖注入、事务管理、消息传递等。在Spring框架中,Bean是核心组件,它们代表了应用中的对象。然而,关于Spring框架中的Bean是否是线程安全的,这是一个值得深入探讨的问题。Spring框架中的Bean默认是线程不安全的,线程安全问题与Bean的作用域、实现方式以及如何使用这些Bean有关。

喜欢猪猪 1587

Spring、Spring MVC、MyBaits框架的学习

Spring、Spring MVC、MyBaits框架的学习

m0_56375612的博客 433

Java 常见的面试题(Spring/Spring MVC)

Java 常见的面试题(Spring/Spring MVC)

MR.骑士道 4883
上一篇: Spring MVC的单元测试和集成测试(不使用mock)
下一篇: 在eclipse项目目录中去掉Maven生成的target目录
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值