首页 > 其他分享 >单例bean与原型bean的区别

单例bean与原型bean的区别

时间:2023-03-12 09:33:05浏览次数:38  
标签:请求 Spring bean 实例 原型 单例

在使用Spring开发时,Spring提供了五种scope,分别为singleton,prototype,request,session,global session。
image
上图为各个scope描述的官方文档截图。Spring在一开始的时候只提供了singleton和prototype两种bean scope.

单例bean与原型bean的区别,以及Spring中的bean为何默认是单例模式

单例Bean和原型Bean的区别(Singleton VS Prototype)

当一个bean被声明为单例bean(singleton)的时候,在处理多次请求的时候Spring容器中只会实例化出一个bean,且后续的请求都会共用这个对象,这个对象将被保存在一个Map集合中。当有请求来时则先从缓存中查看之前有无生成该对象,有的话直接使用这个对象,没有则实例化一个新的对象。而对于原型bean(Prototype)来说,每次请求来时都直接实例化新的bean,没有从缓存中查询获取的过程。

单例bean的优势

  • 减少了新生成实例的消耗。这个消耗主要体现在①Spring在创建实例时会造成性能的消耗。②给对象分配内存也会涉及到一些复杂的算法。
  • 可以快速的获取到bean。在单例下的bean除了第一次生成时需要创建bean外,其余时间都是从缓存(Map)中获取,所以速度快。
  • 减少jvm垃圾回收。对于所有请求只生成一个bean实例,所以垃圾回收自然就少了。

单例bean的劣势

单例bean的一个很大劣势是他是线程不安全的。由于所有请求都共享一个bean实例,且当这个bean有状态的时候在并发的场景下容易出现问题,相比之下原型bean则不会有这样的问题(也有例外,比如这个原型bean被单例bean所依赖),因为原型bean会给每个请求都新创建实例。

总结

Spring中bean之所以默认是单例模式,主要还是为了提高性能,从前面的少创建实例,缓存快速获取以及减少垃圾回收可看出。而单例模式的劣势在于如果bean有状态则在并发环境下是线程不安全的。

标签:请求,Spring,bean,实例,原型,单例
From: https://www.cnblogs.com/atwood-pan/p/17207625.html

相关文章

  • 【教学典型案例】22.原型图的面向对象
    目录​​一:背景介绍​​​​二:面向对象思想​​​​面向对象思想:​​​​三:分析过程​​​​1、颗粒封装、组合使用​​​​将所有页面中的公共内容抽取出来,封装成组件​​......
  • bean的创建
    1.spring启动2.配置扫描3.生成筛选单例BeanDefinition合并4.加载类5.实例化前6.推断构造方法7.实例化8.实例化后9.填充属性(变量、依赖注入@Autowire、@Resource)10......
  • 单例
    单例(一个脚本调另一个脚本里的变量或方法)示例//待调用的代码usingUnityEngine; publicclassJuse:MonoBehaviour{publicstaticJusem_Instance;    voi......
  • Spring-DI(依赖注入)及Bean的作用域
    DI(依赖注入)1、构造器注入前面已经说过了2、set方式注入【重点】依赖注入:Set注入依赖:bean对象的创建依赖于容器注入:bean对象中的所有属性,由容器来注入【环境......
  • Spring-Bean的自动装配
    Bean的自动装配自动装配是Spring满足bean依赖的一种方式Spring会在上下文中自动寻找,并自动给bean装配属性在Spring中有三种装配的方式在xml中显式的配置在java中显......
  • Spring:简述一下bean的生命周期吧?
    bean的生命周期是指它在ioc容器中从创建到销毁的整个过程。 <hr> 一、生命周期1、实例化,为对象分配内存。2、构造方法。3、属性注入,set注入。4......
  • Spring:IOC容器创建Bean的方式有哪几种?
    三种:直接使用构造器、从静态工厂中拿、从实例工厂中拿。 一、直接使用构造器1、配置bean<beanclass="com.lurenjia.dao.DemoDao"id="demoDao"></bean>2、从......
  • Spring Bean Scope
    singleton默认情况,为每个SpringIoC容器将单个Bean定义的Scope扩大到单个对象实例。只有一个单例bean的共享实例被管理,所有对具有符合改bean定义的ID的bean的请求都会被s......
  • 使用Python实现单例模式
    在使用类名()创建对象时,python解释器首先会调用__new__()方法为对象分配内存,然后再调用__init__()方法进行初始化: 其中__new__()是object基类提供的内置静态方......
  • spring学习48-自动装配中定义的bean的作用域
    pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchem......