Spring中bean的作用域详解

在上一篇"struts2和Spring2整合问题"笔记中描述了将Struts2的action交给Spring来进行管理时的问题,在这里对Spring中bean的配置scope属性进行一个详解(引自zhangwenzhuo的博客):

 

在spring2.0之前bean只有2种作用域即:singleton(单例)、non-singleton(也称prototype),Spring2.0以后,增加了session、request、global session三种专用于Web应用程序上下文的Bean。因此,默认情况下Spring2.0现在有五种类型的Bean。当然,Spring2.0对Bean的类型的设计进行了重构,并设计出灵活的Bean类型支持,理论上可以有无数多种类型的Bean,用户可以根据自己的需要,增加新的Bean类型,满足实际应用需求。

1、singleton作用域

当一个bean的作用域设置为singleton,那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。
配置实例:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
或者
<bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>

2、prototype

prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当于一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)
配置实例:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/>
或者
<beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/>


3、request

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

如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现:

<web-app>..<filter> <filter-name>requestContextFilter</filter-name> <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class></filter> <filter-mapping> <filter-name>requestContextFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>...</web-app>

接着既可以配置bean的作用域了:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/>


4、session

session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效,配置实例:
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="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类型来使用。
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/>

6、自定义bean装配作用域

在spring 2.0中作用域是可以任意扩展的,你可以自定义作用域,甚至你也可以重新定义已有的作用域(但是你不能覆盖singleton和prototype),spring的作用域由接口org.springframework.beans.factory.config.Scope来定义,自定义自己的作用域只要实现该接口即可,下面给个实例:

我们建立一个线程的scope,该scope在表示一个线程中有效,代码如下:

publicclass MyScope implements Scope 
{ 
      private final ThreadLocal threadScope = new ThreadLocal()  
     {
            protected Object initialValue() {
                    returnnew HashMap(); 
            } 
      }; 
      public Object get(String name, ObjectFactory objectFactory)  
      { 
              Map scope = (Map) threadScope.get(); 
              Object object = scope.get(name); 
              if(object==null) { 
                       object = objectFactory.getObject(); 
                       scope.put(name, object); 
              } 
              return object; 
      } 
      public Object remove(String name) { 
              Map scope = (Map) threadScope.get(); 
              return scope.remove(name); 
      }
      publicvoid registerDestructionCallback(String name, Runnable callback)
      { 
      }
      public String getConversationId() {
               // TODO Auto-generated method stubreturnnull;
      }
} 

 

Python面试题及详细答案150道(126-135) -- 数据库交互篇 本文介绍了Python中操作MySQL、SQLite数据库及ORM框架的核心技术。主要内容包括:1. 使用pymysql连接MySQL数据库,演示了连接配置、SQL执行和事务管理;2. ORM原理及主流框架SQLAlchemy和Django ORM的示例;3. 通过sqlite3模块操作轻量级SQLite数据库;4. 数据库事务的ACID特性解析。这些内容涵盖了Python数据库开发的关键知识点,适合准备前后端面试的开发者复习核心概念和实际应用。 阅读详情

相关推荐

Streamlit(九) widgets-input

st.text_input / st.number_input / st.date_input / st.time_input 源码路径:${python}\Lib\site-packages\streamlit\elements\text_widgets.py(number_input.py, time_widgets.py) st.text_input st.text_input(label, value="", max_chars=None, key=None,\

heianduck的博客 3354

Spring Bean的五个作用域

Spring支持五个作用域:singleton、prototype、request、session、global session

Ahuuua的博客 1万+

黑暗中的爆破(船讯网Ais爬虫暨爬虫实战js逆向学习经验分享)

船讯网 爬虫 js逆向 python

returnadsss的博客 1575

springBean的作用域

bean的作用域和生命周期

一条游向寒江的鱼 1373

手把手教你用Xilinx SelectIO IP核搞定ADS42LB69高速ADC的DDR数据采集(附仿真调试技巧)

本文详细介绍了如何使用Xilinx SelectIO IP核实现ADS42LB69高速ADC的DDR数据采集,包括IP核配置、仿真验证和硬件调试技巧。通过精准的时序控制和实战调试方法,解决高速数据采集中的时序对齐问题,提升系统稳定性和可靠性。特别适合FPGA工程师和高速ADC接口设计者参考。

weixin_42533622的博客 151

Rust 与 Golang 深度对决:从语法到应用场景的全方位解析

Rust 定义函数以fn关键字开头,参数需明确指定类型,返回值类型紧跟在箭头->之后。// 定义函数add,接收两个i32类型参数a和b,返回i32类型结果,功能为两数相加a + bRust 和 Golang 各有千秋,在不同领域展现独特优势。Rust 凭借强大的内存安全与高性能,在系统编程、网络编程以及对内存安全和性能要求高的场景中表现突出;Golang 则以简洁语法和出色并发性能,在云计算、分布式系统、Web 开发等领域占据一席之地。

muyouking 1769

Spring中Bean的作用域

Spring 中 bean 的 5 种作用域,然后详细介绍 singleton 和 prototype 这两种最常用的作用域。

unber的博客 5911

【SAP HANA 46】关于HANA CPU高峰到 80-100%

关于HANA CPU高峰到 80-100%

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 428

Spring - Bean的6种作用域

程序中变量的可用范围就叫做作用域,或者说在源代码中定义某个变量在某个区域就叫做作用域。而Bean的作用域是指Bean在Spring整个框架中的某种行为模式,比如singleton单例作用域,就表示Bean在spring中只有一份,全局共享的,当A修改了这个值后,那么B再使用时就是修改后的值。

Original0的博客 2107

深度学习中常用的几种卷积(下篇):膨胀卷积、可分离卷积(深度可分离、空间可分离)、分组卷积(附Pytorch测试代码)

膨胀卷积也称为扩张卷积或空洞卷积,一般可通过对标准二维卷积的卷积核设置合适的膨胀率(具体地指卷积核元素之间的距离)实现。合理利用膨胀卷积可在不引入其他参数的同时,扩大输出中元素的感受野,提高特征的全局表示能力。下面通过展示几个不同膨胀率下的卷积核大小以及感受野变化情况,可以更直观的理解:图中灰色为输入,蓝色为卷积核,黄色为输出。1)dilation=1:表示卷积核元素之间距离为1,使用0进行大小为dilation-1=0的填充(这是默认情况),因此。

NorthSmile的博客 9013

5、模糊风险评估

本文介绍了基于模糊逻辑的风险评估方法,探讨了如何在不确定、不完整信息环境下进行高效的风险分析。文章涵盖了模糊集合与隶属度函数的基本概念、模糊推理系统的流程,并结合犯罪风险、金融风险和医疗诊断等实际案例,展示了模糊风险评估的应用价值和技术细节。此外,还介绍了模糊贝叶斯网络、模糊综合评价等进阶工具与方法,为多领域风险管理提供了理论支持和实践指导。

mango的博客 179

再谈Spring(一):Bean的作用域

(尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.youkuaiyun.com/article/details/91477092冷血之心的博客) 今天准备开始一个Spring系列文章,主要记录一些学习和使用Spring过程中遇到的小知识,所以我起了《再谈Spring》的名字。 Spring是一个轻量级的IOC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目...

冷血之心的博客 2737

Oracle EBS R12 AR 标准发票 核心表结构

​ Oracle EBS R12 AR 标准发票 核心表结构 聚焦手动标准发票 (Standard Invoice),按头→行→分配→税→收款计划→会计分录→历史分层,标注主键、外键、关键字段、业务含义,同时说明表间关联关系,适配开发 / 运维 / 数据核对场景。 一、主数据层(发票头 + 行,核心业务表) 1. RA_CUSTOMER_TRX_ALL 【发票头表】 作用:存储整张发票头部信息,一张发票对应一条记录,AR 发票主表。 主键:CUSTOMER_TRX_ID (唯一 ID,系统内部键) 业

金牌架构师 280

详解Spring原理之Bean的作用域

详解Bean的作用域,包括singleton,prototype,request,session,application,websocket.

. 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring bean的作用域详解

Spring bean的作用域详解!

weixin_68093610的博客 1501

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring Bean 的作用域详解

本文将详细介绍 Spring 支持的五种主要 Bean 作用域。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

详解Spring中bean的作用域

Spring中bean的作用域用scope来表示。scope的值有两个:singleton为单粒,即Spring IoC容器只会创建该bean的唯一一个实例,这也是默认的。该实例就会一直放在缓存里供大家使用。 AD: Spring中bean的作用域 Spring中bean的作用域用scope来表示。 scope的值有两个: singleton为单

Kaiwii的专栏 1098

Spring Bean 作用域详解

在 Spring 中,那些组成应用程序的主体,以及由 Spring IOC 容器所管理的对象,被称之为 bean。简单地讲,bean 就是由 IOC 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中的其他对象没有什么区别了,而 bean 的定义以及 bean 相互间的依赖关系,将通过配置元数据来描述。 Spring 中的 bean 默认都是单例的,在多线程程序下,这...

happyJared 320

千字详解Spring bean的作用域

Spring 支持多种 Bean 作用域:单例(默认)、原型(每次创建新实例)、会话(Web 环境中每个会话独立)、请求(每个请求独立),其中会话和请求作用域需通过 @Scope 注解或 XML 配置代理模式(proxyMode)解决注入到单例 Bean 时的依赖问题,确保延迟解析并动态获取当前作用域实例。

sosovo66的博客 760

Spring-Bean作用域scope详解

概述 Bean的作用域: 什么是作用域呢?即“scope”,在面向对象程序设计中一般指对象或变量之间的可见范围。而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。 Spring支持以下作用域: 基本作用域:singleton、prototype web作用域 :request、session、global session 自定义作用域 详析 ...

Lili429的博客 1210

详解Spring中Bean的作用域与生命周期

目录 一、Bean的作用域 1、单实例Bean声明 2、多实例Bean声明 二、Bean的生命周期 1、bean的初始和销毁 2、bean的后置处理器 Hello,你好呀,我是灰小猿!一个超会写bug的程序猿! 在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我就来和大家讲一下有关Spring中bean的作用域和其生命周期。 一、Bean的作用域

累计发表博客60余万字,优快云 博客专家、Java 领域优质创作者、华为云享专家、阿里云专家博主。专注分享 Java 优质文章,毕设实战项目开发,全网粉丝10W+ 3184

Spring Bean作用域详解与实践指南

Spring的Bean作用域提供了灵活的方式来控制Bean的生命周期和可见性。开发者可以根据实际需求选择合适的作用域,以确保应用程序的性能和线程安全性。作用域描述适用场景生命周期线程安全问题singleton容器中只有一个实例,共享使用无状态Bean、全局配置类容器启动时创建,关闭时销毁需要特别注意prototype每次请求都创建一个新实例有状态Bean、临时对象每次请求时创建,客户端销毁通常不需要考虑request每次HTTP请求创建一个新实例请求级别的数据处理。

1026

Spring框架中Bean的作用域详解

在 Spring 框架中,Bean 的作用域定义了 Bean 实例的生命周期和可见范围。合理选择作用域可以优化应用性能、确保线程安全并正确管理资源。通过合理配置 Bean 的作用域,可有效提升应用性能和可维护性,避免常见的线程安全和内存泄漏问题。Spring 提供了多种作用域选项,其中最常用的是。,其他作用域需在 Web 环境中使用。

zty0721的博客 1046

Spring Bean 作用域万字详解

本文全面解析Spring框架中的Bean作用域机制。Spring提供了6种标准作用域(singleton、prototype、request、session、application、websocket),每种作用域决定Bean实例的创建方式、生命周期和可见范围。文章详细分析了各作用域的特性、适用场景和配置方法,深入探讨单例和原型作用域的实现原理及线程安全问题,并针对Web相关作用域提供具体应用示例。同时介绍了作用域代理机制解决不同作用域Bean间的依赖问题,以及如何通过实现Scope接口自定义作用域。最后总

油墨香^-^的博客 1050

Spring基于XML的配置:Bean作用域详解

本文介绍了Spring框架中Bean作用域的核心概念与配置实践。主要内容包括:1)Spring支持的5种作用域类型(singleton、prototype等)及其特性;2)XML配置方式示例,通过scope标签定义单例和原型Bean;3)测试验证方法,展示不同作用域Bean的生命周期差异;4)Maven依赖配置;5)最佳实践建议,分析不同场景下的适用模式;6)扩展思考如何自定义作用域。文章通过序列图、代码示例和对比测试,直观演示了Spring作用域的工作机制,为开发者合理选择作用域策略提供了实用指导。&lt

weixin_51786043的博客 883

Spring-bean作用域scope详解

Spring Framework支持五种作用域(其中有三种只能用在基于web的Spring ApplicationContext)。 singleton 在每个Spring IoC容器中一个bean定义对应一个对象实例。 prototype 一个bean定义对应多个对象实例。 request 在一次...

dengkuituo0680的博客 175
上一篇: struts2和Spring2整合问题
下一篇: Struts2中访问HttpServletRequest和HttpSession
javaRwx
博客等级 码龄20年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值