好奇springmvc是单例的还是多例的?

最近看见一个面试题,springmvc是单例的还是多例的?当时犹豫了好久,想着多例吧。错误!默认是单例的。

有状态对象(Stateful Bean) :就是有实例变量的对象,可以保存数据,是非线程安全的。每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

无状态对象(Stateless Bean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

好奇springmvc是单例的还是多例的?
测试 http://localhost:8080/mvc/add num----> 1
http://localhost:8080/mvc/add num----> 2
http://localhost:8080/mvc/reduce num----> 1
好奇springmvc是单例的还是多例的?

控制台打印出结果证明 单例 从始至终 num都是一个实例


再次测试 加入**@Scope(“prototype”)** 变成多例 再看下num的数值
好奇springmvc是单例的还是多例的?
测试 http://localhost:8080/mvc/add num----> 1
http://localhost:8080/mvc/add num----> 1
http://localhost:8080/mvc/reduce num----> -1
好奇springmvc是单例的还是多例的?


为什么是单例的?

  1. 减少实例生成的系统消耗,效率会高
  2. gc垃圾回收,就不会回收,因为没有生成实例
  3. 可以更快的获取到bean ,第一次生成之后 ,就不会再次生成,每次取都是缓存中取

有一个很大的劣势,不能保证线程安全
全局变量和静态变量会引起线程安全问题
若所有的操作都是对变量进行读操作就不会引起线程问题,若有写的操作,那么就需要考虑线程安全问题

相关文章:

  • 2022-12-23
  • 2021-10-17
  • 2022-12-23
  • 2021-11-19
  • 2022-12-23
  • 2021-12-14
猜你喜欢
  • 2021-09-11
  • 2021-10-03
  • 2022-12-23
  • 2021-05-14
  • 2022-12-23
  • 2022-12-23
  • 2021-06-20
相关资源
相似解决方案