Bean的五个作用域

Posted zhangsonglin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bean的五个作用域相关的知识,希望对你有一定的参考价值。

技术图片

一、Singleton
技术图片

Singleton是单例类型,bean默认就是单例的,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。当开发者定义一个Bean的作用域为单例时,Spring IoC容器只会根据Bean定义来创建该Bean的唯一实例。这些唯一的实例会缓存到容器中,后续针对单例Bean的请求和引用,都会从这个缓存中拿到这个唯一的实例
<bean id="ServiceImpl" class="com.service.ServiceImpl" scope="singleton">

二、Prototype
技术图片

Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象.
(对有状态的bean应该使用prototype作用域,
对无状态的bean则应该使用singleton作用域)
<bean id=" ServiceImpl " class=" com.service.ServiceImpl " scope="prototype"/>
或者
<bean id=" ServiceImpl " class=" com.service.ServiceImpl " singleton="false"/>

三、request
当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;(每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成)该作用域仅在基于web的Spring ApplicationContext情形下有效
<bean id="goInt" class= “com.zsl.action.goInt " scope="request"/>
针对每次HTTP请求,Spring容器会根据goInt bean的定义创建一个全新的bean实例,且该goInt bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,不会影响到其他的bean,http请求协议是无连接,无状态的,而其他请求中根据goInt bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

四、session
当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效
<bean id=" goInt " class=" com.zsl.action.goInt " scope="session"/>
针对某个HTTP Session,Spring容器会根据goInt bean定义创建一个全新的bean实例,且该goInt bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据goInt创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

五、Global Session
当一个bean的作用域为Global Session,表示在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。
<bean id="user" class="com.zsl.user "scope="globalSession"/>
global session作用域类似于标准的HTTP Session作用域, 与session大体相同,但仅在portlet应用中使用。Portlet规范定义了全局session的概念。请求的bean被组成所有portlet的自portlet所共享。
如果不是在portlet这种应用下,globalSession则等价于session作用域。

request,session以及global session这三个作用域都是只有在基于web的SpringApplicationContext实现的(比如XmlWebApplicationContext)中才能使用。
如果开发者仅仅在常规的Spring IoC容器中比如ClassPathXmlApplicationContext中使用这些作用域,那么将会抛出一个IllegalStateException来说明使用了未知的作用域。

借鉴于:
https://blog.csdn.net/jishuizhipan/article/details/79391651
https://blog.csdn.net/fuzhongmin05/article/details/73389779

个人温故学习之用

以上是关于Bean的五个作用域的主要内容,如果未能解决你的问题,请参考以下文章

spring的bean作用域有几种,开发中需要注意啥?

spring中bean的五种作用域?Spring中的bean是线程安全的吗?

Spring Bean 作用域

数组的五个迭代方法

Java框架spring Boot学习笔记:Bean的作用域

springmvc enablewebmvc注解作用