zoukankan      html  css  js  c++  java
  • 面试题:Spring为什么默认bean为单例?

    Spring提供了5种scope分别是singleton、prototype、request、session、global session。

    官方文档介绍:


    单例bean与原型bean的区别
    单例:一个bean被声明为单例时,处理多次请求时spring容器里只实例化一个bean,后续的请求公用这个对象,这个对象存储在一个map中,当有请求时,先在缓存中(map)查找是否存在,存在则使用,不存在才实例化一个对象

     

    原型:每当有请求来就实例化一个新的bean,没有缓存以及从缓存中查


    源码分析
    生成bean时先判断单例的还是原型

    如果是单例的则先尝试从缓存里获取,没有在新创建

    结论:
    1、单例的bean只有第一次创建新的bean 后面都会复用该bean,所以不会频繁创建对象。

    2、原型的bean每次都会新创建

    单例bean的优势
    由于不会每次都新创建新对象所以有一下几个性能上的优势:

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

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

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

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

    总结
    面试题:Spring 为啥把bean默认设计成单例?

    答案:

    为了提高性能
    少创建实例*
    垃圾回收
    缓存快速获取
    单例有啥劣势?
    如果是有状态的话在并发环境下线程不安全。

    什么是有状态对象?什么是无状态对象?
    有状态对象:有实例变量可以标志其对象所处的状态。(有实例变量的对象,有存储数据能力)- 白话:有属性的对象
    无状态对象:无实例变量可以标志其对象所处的状态。(无实例变量的对象,无存储数据能力)- 白话:无属性的对象

  • 相关阅读:
    C. Shaass and Lights 解析(思維、組合)
    D. Binary String To Subsequences(队列)(贪心)
    CodeForces 1384B2. Koa and the Beach (Hard Version)(贪心)
    CodeForces 1384B1. Koa and the Beach (Easy Version)(搜索)
    CodeForces 1384C. String Transformation 1(贪心)(并查集)
    CodeForces 1384A. Common Prefixes
    POJ-2516 Minimum Cost(最小费用最大流)
    POJ3261-Milk Patterns(后缀数组)
    HDU-1300 Pearls(斜率DP)
    HDU-4528 小明系列故事-捉迷藏(BFS)
  • 原文地址:https://www.cnblogs.com/cxxjohnson/p/14624104.html
Copyright © 2011-2022 走看看