码迷,mamicode.com
首页 > 其他好文 > 详细

Bean的五个作用域

时间:2019-05-24 22:22:55      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:contex   图片   cep   img   表示   exce   应该   基于   ESS   

技术图片

一、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的五个作用域

标签:contex   图片   cep   img   表示   exce   应该   基于   ESS   

原文地址:https://www.cnblogs.com/zhangsonglin/p/10920406.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!