首页 > 百科知识 正文

24K程序员spring的controller是单例还是多例(spring单例和原型模式)

时间:2023-11-20 10:26:06 阅读:249 作者:从来没忘记

计算机软件、编程、Java开发、spring、程序员

吐槽

面试官:springMVC的controller是单例还是多例

程序员:多例

面试官:你可以马上回家等消息了

准备
  • springboot
  • springmvc
  • springbean作用域的单例(默认)、多例
  • 单例bean声明成员变量是线程不安全的(别搞反了)
【Spring MVC】controller之单例模式

配置bean,一个默认(单例),一个多例

24K程序员spring的controller是单例还是多例(spring单例和原型模式)-第1张

默认吧controller的作用域去掉

24K程序员spring的controller是单例还是多例(spring单例和原型模式)-第2张

运行结果

http://localhost:8080/check

调用controller3次方法,两个bean竟然都是一样的

24K程序员spring的controller是单例还是多例(spring单例和原型模式)-第3张

给controller增加作用域多例

24K程序员spring的controller是单例还是多例(spring单例和原型模式)-第4张

运行结果

这下单例bean地址输出一样的

多例bean每次bean输出都不一样了

24K程序员spring的controller是单例还是多例(spring单例和原型模式)-第5张

开发总结
  • SpringMVC的controller默认就是单例的
  • 如果你bean配置多例了,依赖这个bean的bean也需要多例才行啊(看例子)
  • 在单例的bean中切记声明成员属性(如Map、List集合来缓存数据),是线程不安全的
单例bean线程不安全分析(有成员变量情况)
  • 1:写线程同步代码 ,缺点可能会导致性能耗损
  • 2:如果你是springbean,可以scope="prototype" 每次请求多是新对象,就不存在线程安全 缺点可能会导致性能耗损 <bean id="xxxProcessor" scope="prototype" class="com.xxx.xxxProcessor"/>
  • 3:把共享的资源放到方法里,每次方法调用都是新资源(是局部变量嘛) 因此也没线程安全问题了,缺点可能会导致代码复杂度上升
springboot启动图

24K程序员spring的controller是单例还是多例(spring单例和原型模式)-第6张

程序员专家请多多喷我,我哪里不对请指出

版权声明:该问答观点仅代表作者本人。如有侵犯您版权权利请告知 cpumjj@hotmail.com,我们将尽快删除相关内容。