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

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

吐槽

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

程序员:多例

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

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

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

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

默认吧controller的作用域去掉

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

运行结果

http://localhost:8080/check

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

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

给controller增加作用域多例

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

运行结果

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

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

spring单例和原型模式(24K程序员spring的controller是单例还是多例)(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启动图

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

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

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页