Spring配置文件中<bean>标签的scope属性

摘要:
portlet规范定义了全局会话的概念,它由构成portlet web应用程序的所有不同portlet共享。全局会话范围中定义的bean仅限于全局portletSession的生命周期。对于具有数据成员变量的类,需要指定scope=“prototype”或singleton=“false”。所有有状态bean都使用Prototype范围,而无状态bean应该使用singleton范围。

转自:https://fj-sh-chz.iteye.com/blog/1775149

singleton  (默认属性) 

Spring将Bean放入Spring IOC容器的缓存池中,并将Bean引用返回给调用者,spring IOC继续对这些Bean进行后续的生命管理。BeanFactory只管理一个共享的实例。所有对这个特定bean的实例请求,都导致返回这个唯一 bean实例的引用。 

即每次拿到的对象都是引用的同一个地址的对象。当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。 


2.prototype 

Spring将Bean返回给调用者,调用者负责Bean后续生命的管理,Spring不再管理这些Bean的生命周期。 
每次对这个bean的实例请求都会导致一个新的实例的创建。当用户需要不受其他用户对象影响的对象或有类似的需求时,这是一个较理想的解决办法。 


即每次拿到的对象都是引用的不同地址的对象。相当于一个new的操作。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责 


以下的3种scope都使用的较少,类似于J2EE里面的request和session。在使用SpringMVC是可能会用到。 


3.request 

‍request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,配置实例: request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置:如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可: 

‍<listener> 
   <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 



4.session 


‍session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效 



5.global session 

‍global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个 portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用 



对于Action来说需要指明scope=”prototype”或singleton=”false”,因为Action是线程不安全的,可能会导致跳转的页面错误。 

对于带有数据成员变量的类需要指明scope=”prototype”或singleton=”false”。不然这样会导致多个线程共用同一个成员变量。 


有状态的bean都使用Prototype作用域,而对无状态的bean则应该使用singleton作用域。

免责声明:文章转载自《Spring配置文件中&amp;lt;bean&amp;gt;标签的scope属性》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android中用文件初始化sqlite 数据库的文(一) (转)Java技术栈下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Redis集群下过期key监听

1. 前言 在使用redis集群时,发现过期key始终监听不到。网上也没有现成的解决方案。于是想,既然不能监听集群,那我可以建立多个redis连接,分别对每个redis的key过期进行监听。以上做法可能不尽人意,目前也没找到好的解决方案,如果有好的想法,请留言告知哦!不多说,直接贴我自己的代码! 2. 代码实现 关于Redis集群配置代码此处不贴,直接贴配...

django面试题必问

1、谈谈你对http协议的认识。 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。HTTP是一个应用层协议,由请...

Spring中单例和多例模式

Spring容器管理的bean在默认情况下是单例的,也是一个bean只会创建一个对象,存在内置 map中,之后无论获取多少次该bean,都返回同一个对象。这样可以减小了对象的创建,从而减小了内存的开销。 bean在单例或多例模式下的生命周期: 单例模式 bean在单例模式下,spring容器启动时解析xml文件发现该bean标签后,直接创建该bean对象...

Hibernate三种状态:瞬时状态、持久化状态、离线状态

三种状态及相互转化 瞬时状态(transient):刚new出来一个对象,还没有被保存到数据库中 持久化状态(persistent):已经被保存到数据库中或刚从数据库中取得 离线状态(detached):数据库中有,但是session中不存在该对象 方法的代码实例(下面代码1-8是连贯的,但由于需要分条说明,因此拆开) (1) save():把一个对象从...

21.Shiro在springboot与vue前后端分离项目里的session管理

1.前言 当决定前端与后端代码分开部署时,发现shiro自带的session不起作用了。 然后通过对请求head的分析,然后在网上查找一部分解决方案。 最终就是,登录成功之后,前端接收到后端传回来的sessionId,存入cookie当中。 之后,前端向后端发送请求时,请求Head中都会带上这个sessionid。 后端代码通过对这个sessionid的解...

JPA或Hibernate中的

JPA执行原生SQL截断Char类型问题 在JPA的API中执行原生SQL:EntityManager.createNativeQuery(String sqlString);传入参数是原生SQL语句,返回SQL对象。 如果oracle数据库中某个字段定义的是char类型,比方说是char[2],当使用EntityManager.createNativeQ...