Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spring中Bean的作用域

spring中Bean的作用域

作者头像
MickyInvQ
发布于 2020-09-27 08:41:31
发布于 2020-09-27 08:41:31
9610
举报
文章被收录于专栏:InvQ的专栏InvQ的专栏

Bean简介:

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

Bean的作用域

创建一个bean定义,其实质是用该bean定义对应的类来创建真正实例的“配方(recipe)”。把bean定义看成一个配方很有意义,它与class很类似,只根据一张“处方”就可以创建多个实例。

你不仅可以控制注入到对象中的各种依赖和配置值,还可以控制该对象的作用域。这样你可以灵活选择所建对象的作用域,而不必在Java Class级定义作用域。Spring Framework支持五种作用域(其中有三种只能用在基于web的Spring ApplicationContext)。

1、singleton:当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。

注意:Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:

<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton">

2、prototype一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

3、request在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。

考虑下面bean定义:

<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>

针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例, 且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态, 而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。 当处理请求结束,request作用域的bean实例将被销毁。

4、session在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

考虑下面bean定义:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例, 且该userPreferences bean仅在当前HTTP Session内有效。 与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例, 将不会看到这些特定于某个HTTP Session的状态变化。 当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

5、global session在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。

考虑下面bean定义:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>

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

请注意:假如你在编写一个标准的基于Servlet的web应用,并且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015/09/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
spring bean的作用域
Bean的作用域 参考:spring FrameWork官方文档 spring4.x中官方有7中作用域,如果使用的是applicationContext作为容器的话就只用5中作用域 下面的其中作用域为
用户1418372
2018/09/13
1.3K0
spring bean的作用域
Spring Bean 作用域详解
在 Spring 中,那些组成应用程序的主体,以及由 Spring IOC 容器所管理的对象,被称之为 bean。简单地讲,bean 就是由 IOC 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中的其他对象没有什么区别了,而 bean 的定义以及 bean 相互间的依赖关系,将通过配置元数据来描述。
happyJared
2019/09/30
1.2K0
Spring Bean 作用域详解
详述 Spring 中 Bean 的作用域、事务的隔离级别以及传播行为
Spring IOC 容器创建一个 Bean 实例时,可以为 Bean 指定实例的作用域,作用域包括:
CG国斌
2021/12/07
5110
Spring中bean的作用域与生命周期
在 Spring 中,那些组成应用程序的主体及由 Spring IoC 容器所管理的对象,被称之为 bean。简单地讲,bean 就是由 IoC 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中的其他对象没有什么区别了。而 bean 的定义以及 bean 相互间的依赖关系将通过配置元数据来描述。
业余草
2021/12/06
8960
Spring中bean的作用域与生命周期
谈谈Spring bean的生命周期,作用域
​ 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。而bean的定义以及bean相互间的依赖关系将通过配置元数据来描述。
小马哥学JAVA
2022/11/21
6260
别再找了,这就是全网最全的SpringBean的作用域管理!
创建 BeanDefinition 时,就等于创建了一个配方,用于创建由 BeanDefinition 所定义的类实例。BeanDefinition 是配方的这种思想很重要,因为这意味着,与使用类一样,也可通过一个配方创建多个对象实例。
JavaEdge
2021/10/18
7690
Spring Bean的作用域管理1. singleton2. prototype3. Request4. session5. global session
Spring框架支持5种作用域,有三种作用域是当开发者使用基于web的ApplicationContext的时候才生效的。 下面就是Spring内置支持的作用域 作用域 描述 单例(singleton) (默认)每一个Spring IoC容器都拥有唯一的一个实例对象 原型(prototype) 一个Bean定义可以创建任意多个实例对象 请求(request) 一个HTTP请求会产生一个Bean对象,也就是说,每一个HTTP请求都有自己的Bean实例。只在基于web的Spring ApplicationCon
JavaEdge
2018/05/16
2.1K0
Spring5参考指南:Bean作用域
Bean是Spring的根本,Spring本身就是一个一个的bean组成的,bean托管在Spring容器中,那么这些bean的作用域范围是怎么样的呢?
程序那些事
2020/07/07
8390
Spring之IOC
IOC 控制反转, 将由程序直接操控的对象调用权交给容器, 通过容器来实现对象的装配和管理. 容器即applicationContext.xml 第一个spring程序 1 // 创建容器对象, 一开始就初始化Bean 2 ApplicationContext context = new ClassPathXmlApplicationContext("day1202/applicationContext.xml"); 3 TestService service
用户1216491
2018/01/24
6360
Spring-03 依赖注入(DI)
几种作用域中,request、session作用域仅在基于web的应用中使用,只能用在基于web的Spring ApplicationContext环境。
张小驰出没
2021/04/15
3200
Spring-03  依赖注入(DI)
Spring scope 作用域
Spring scope 作用域 今天研究了一下scope的作用域。默认是单例模式,即scope="singleton"。 另外scope还有prototype、request、session、glo
Java帮帮
2018/03/15
1K0
Spring scope 作用域
Spring框架参考手册_5.0.0_中英文对照版_Part II_3.5
When you create a bean definition, you create a recipe for creating actual instances of the class defined by that bean definition. The idea that a bean definition is a recipe is important, because it means that, as with a class, you can create many object instances from a single recipe.
Tyan
2022/05/09
5210
Spring-Bean的作用域
在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域。
小小工匠
2021/08/16
3690
Spring中bean的作用域
1、singleton作用域 当一个bean的作用域设置为singleton, Spring IOC容器只会创建该bean定义的唯一实例。 2、prototype  prototype作用域部署的bean,每一次请求都会产生一个新的bean实例,相当与一个new的操作。 3、request request表示该针对每一次HTTP请求都会产生不同的bean实例,只有在web应用中使用Spring时,该作用域有效。 4、session session作用域表示该针对每一次HttpSession请求都会产生不同的bean实例。只有在web应用中使用Spring时,该作用域有效。 5、global session 每个全局的HttpSession对应一个Bean实例。典型情况下,仅在使用portlet context的时候有效。只有在web应用中使用Spring时,该作用域有效。 6.自定义作用域 在Spring 2.0中,Spring的bean作用域机制是可以扩展的。这意味着,你不仅可以使用Spring提供的预定义bean作用域; 还可以定义自己的作用域,甚至重新定义现有的作用域(不提倡这么做,而且你不能覆盖内置的singleton和prototype作用域)。
week
2018/08/27
6830
Spring框架参考手册_5.0.0_中文版_Part II_3.5
        当你创建bean定义时,你创建了一个配方用于创建bean定义中定义的类的实例。bean定义是配方的想法是很重要的,因为这意味着对于一个类,你可以根据一个配方创建许多对象实例。
Tyan
2022/05/09
4760
Spring框架参考手册_5.0.0_中文版_Part II_3.5
Spring Bean 作用域
当在 Spring 中定义一个 bean 时,你必须声明该 bean 的作用域的选项。例如,为了强制 Spring 在每次需要时都产生一个新的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。同理,如果你想让 Spring 在每次需要时都返回同一个bean实例,你应该声明 bean 的作用域的属性为 singleton。
六月的雨在Tencent
2024/03/28
1140
Spring中Bean的作用域深入剖析与技术实践
这篇文章系统地介绍了Nacos作为Dynamic Naming and Configuration Service,是构建云原生应用的重要工具,提供了动态服务发现、配置管理和服务管理功能。其总体架构包含命名服务、配置服务和元数据服务,三大组件协同工作,支持微服务架构。Nacos支持单机、集群和多集群模式,满足不同场景需求。服务注册与发现、配置管理和元数据管理是Nacos的核心功能,实现了服务的动态管理和配置的灵活更新。推荐各位有需要的同学。
小马哥学JAVA
2024/12/05
3620
谈谈 Spring Bean 的生命周期和作用域?
首先,创建 Bean 会经过一系列的步骤,主要包括: 实例化 Bean 对象。 设置 Bean 属性。 如果我们通过各种 Aware 接口声明了依赖关系,则会注入 Bean 对容器基础设施层面的依 赖。 具体包括 BeanNameAware、BeanFactoryAware 和 ApplicationContextAware,分 别会注入 Bean ID、Bean Factory 或者 ApplicationContext。 调用 BeanPostProcessor 的前置初始化方法 postProcessBeforeInitialization。 如果实现了 InitializingBean 接口,则会调用 afterPropertiesSet 方法。 调用 Bean 自身定义的 init 方法。 调用 BeanPostProcessor 的后置初始化方法 postProcessAfterInitialization。 创建过程完毕。
葆宁
2019/04/18
6120
谈谈 Spring Bean 的生命周期和作用域?
掌握 Spring IoC 容器与 Bean 作用域:详解 singleton 与 prototype 的使用与配置
这些 bean 是通过您提供给容器的配置元数据创建的。Bean 定义包含了所谓的配置元数据,容器需要了解以下内容:
小万哥
2023/09/10
4950
掌握 Spring IoC 容器与 Bean 作用域:详解 singleton 与 prototype 的使用与配置
为什么Spring中每个Bean中每个Bean都要定义作用域?
前面的视频中都有提到过Spring Bean的作用域。本期视频呢,我针对Spring Bean作用域做一个详细的解答。关于Spring Bean的作用域,我一共分为两个部分来介绍。首先,介绍Spring Bean作用域的定义,然后,介绍Spring为什么要定义作用域?
Tom弹架构
2022/08/22
3630
为什么Spring中每个Bean中每个Bean都要定义作用域?
推荐阅读
相关推荐
spring bean的作用域
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档