Spring为什么默认是单例的?

目录

一、五种作用域

二、单例bean与原型bean的区别

 三、单例Bean的优势与劣势


一、五种作用域

1.singleton:

singleton是Spring Bean的默认作用域,也就是单例模式。在整个应用程序中,只会创建一个实例,Bean的所有请求都会共享这个实例。

2.prototype:

prototype表示原型模式,每次请求都将创建一个新的Bean实例。因此,在应用程序中可以有多个实例,这些实例之间不会相互影响。

3.request:

request表示在HTTP请求范围内创建Bean实例。每次发出HTTP请求时,都会创建一个新的Bean实例,这个Bean实例只能在当前请求中使用。

4.session:

session表示在HTTP会话范围内创建Bean实例。在一次会话期间,只会创建一个Bean实例。如果在同一个会话期间发出多个请求,这些请求都将共享同一个Bean实例。

5.globalsession:

globalsession表示在全局HTTP会话范围内创建Bean实例。这个作用域只适用于基于portlet的Web应用程序。对于其他类型的Web应用程序,globalsession作用域与session作用域是相同的。

二、单例bean与原型bean的区别

如果一个Bean被声明为单例的时候,在处理多次请求的时候在Spring容器里面只实例化出一个Bean,后续的请求都公用这个对象,这个对象会保存到一个map里面。当有请求进来的时候,会先从缓存(map)里查看有没有,有的话直接使用这个对象,没有的话才实例化一个新的对象,所以这是个单例的。但是对于原型(prototype)bean来说,当每次请求进来的时候直接实例化新的bean,没有缓存以及从缓存查的过程。

Spring为什么默认是单例的?_第1张图片

Spring为什么默认是单例的?_第2张图片

 三、单例Bean的优势与劣势

优势:

1、减少了新生成实例的消耗:新生成实例消耗包括两方面,第一,Spring会通过反射或者cglib来生成bean实例,这都是消耗性能的操作,其次给对象分配内存也会涉及复杂算法。

2、减少jvm垃圾回收 :由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。

3、可以快速获取到 bean:因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的,所以很快。

劣势:

单例的 bean一个很大的劣势就是他不能做到线程安全!!!由于所有请求都共享一个 bean实例,所以这个 bean要是有状态的一个 bean的话可能在并发场景下出现问题,而原型的 bean则不会有这样问题(但也有例外,比如他被单例 bean依赖),因为给每个请求都新创建实例。

 

你可能感兴趣的:(spring,java,mybatis)