美文网首页我爱编程
Spring_IOC_04——Bean的作用域

Spring_IOC_04——Bean的作用域

作者: _Zy | 来源:发表于2018-05-23 00:26 被阅读14次

    其他推荐:
    Spring_IOC_01——概念讲解
    Spring_IOC_02——原理解析
    Spring_IOC_03——Bean的生命周期

    Spring Bean 的作用域

    Spring的作用域一般有5种:
    前两种:singleton(默认) prototype,是Spring提供的基础的作用域
    另外三种:request session global session 是SpringMVC专用的作用域。

    使用方式,在XML文件中如下配置:

    <bean id="role" class="com.antony.springDemo.DemoBean" scope="singleton"/>
    

    五种作用域的说明

    • singleton 单例:
      Spring IoC 容器中只会存在一个Bean共享实例,无论有多少Bean引用它,始终指向一个对象。Singleton是Spring的默认作用域

    • prototype 原型(多例):
      每次通过 Spring IoC 容器请求Bean时,容器都会创建一个新的Bean实例返回。每个Bean实例都有自己的属性和状态。

    • request (Spring MVC 专有)
      在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求会产生新的实例对象。当Http请求结束时,响应的Bean就会被销毁。

    • session(Spring MVC 专有)
      在一次Http Session中,容器会返回同一个Bean实例。

    • global session (Spring MVC 专有)
      在一个全局的 Http Session 中,容器会返回同一个Bean实例。仅在使用portletContext 时有效。

    单例和原型作用域的详解:

    1)Singleton
    Spring会对单例模式的Bean进行缓存,请求时尝试从缓存中获取,如果缓存中没有则会执行初始化。

    Spring可以精确的知道该Bean何时被创建、初始化、销毁
    也就是说,我们配置的 初始化前操作 (init-method 等),和 自定义销毁操作 (destory-method 等)都会执行。

    依赖于 Spring lazy-init 默认设置。Spring 默认 IoC 容器会在初始化完成时,将单例的Bean也初始化

    2)Prototype
    Spring不会对其缓存。
    Spring在装配完一个原型实例后,就完全交由客户端管理,Spring不再跟踪其生命周期
    也就是说,初始化的生命周期回调方法,是会被调用的。而销毁的生命周期回调方法,是不会被调用的
    在某些方面来说,Prototype生命周期就是取代了new操作符创建对象。


    单例还是原型

    • 由Spring管理的大多数对象其实都是 无状态对象 ,这些对象不会因为多线程请求而导致状态被破坏,很适合Spring的单例作用域对象。每个单例的无状态对象都是默认线程安全的。
      单例节省了常见对象的GC开销。

    • 单例还是原型?
      Singleton作用域适用于无状态对象,例如 DAO Controller Service Compment 等
      而Prototype适用于有状态对象。(但是Spring MVC 中 有状态数据的一种实践方案是保存在ThreadLocal中)




    (如果有什么错误或者建议,欢迎留言指出)
    (本文内容是对各个知识点的转载整理,用于个人技术沉淀,以及大家学习交流用)


    参考资料:

    张开涛——SpringBean作用域

    相关文章

      网友评论

        本文标题:Spring_IOC_04——Bean的作用域

        本文链接:https://www.haomeiwen.com/subject/mudljftx.html