SpringBean的单例和多例使用

SpringBean的单例和多例使用

在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例)

  • singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。
  • prototype(多例):对这个bean的每次请求都会创建一个新的bean实例,类似于new。

spring可以配置多例对象么

答:可以。spring中bean可以被定义为两个模式:单例和多例

单例:只有一个共享实例的存在,所有对这个bean的请求都会返回这个唯一的实例。不管new多少次。即所有请求都有一个对象来处理

多例:对这个bean的每次请求都会创建一个新的bean实例,类似于new。

什么时候用单例?什么时候用多例?

答:当对象含有可改变状态时(在实际应用中该状态会改变),则多例,否则单例。例如dao和service层的数据一般不会有响应的属性改变,所以考虑单例,而controller层会存储很多需要操作的vo类,此时这个对象的状态就会被改变,则需要使用多例

如何配置多例?

答:在bean上,加一个scope = “prototype”;如果不写个默认是true,也就是单例的,写了就是多例的

SpringBean的单例和多例使用_第1张图片

 

spring的bean为什么是单例的?

答:为了提高性能。

由于不会每次都新创建新对象,所以就减少了新生成实例的消耗。因为spring会通过反射或者cglib来生成bean实例这都是耗性能的操作,其次给对象分配内存也会涉及复杂算法。

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

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

 

bean的scope有五种

(1)singleton: 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例

(2)prototype:表示每次获得bean都会生成一个新的对象

(3)request:表示在一次http请求内有效(只适用于web应用)

(4)session:表示在一个用户会话内有效(只适用于web应用)

(5)globalSession:表示在全局会话内有效(只适用于web应用)

在多数情况,我们只会使用singleton和prototype两种scope,如果未指定scope属性,默认为singleton。

 

你可能感兴趣的:(java,springboot,spring,java,后端)