Spring_IOC_04——Bean的作用域

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

Spring Bean 的作用域

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

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




五种作用域的说明

  • 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的作用域)