其他推荐:
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中)
(如果有什么错误或者建议,欢迎留言指出)
(本文内容是对各个知识点的转载整理,用于个人技术沉淀,以及大家学习交流用)
参考资料:
网友评论