Spring系列四:Bean Scopes作用域
等闲识得东风面,万紫千红总是春。
概述
在Spring
框架中,我们可以在六个内置的spring bean
作用域中创建bean
,还可以定义bean
范围。在这六个范围中,只有在使用支持Web
的applicationContext
时,其中四个可用。singleton
和prototype
作用域可用于任何类型的ioc
容器。
Spring Bean作用域类型
在Spring
中,可以使用spring
中的 @Scope
注解定义bean
的作用域。下面我们已经列出这六个在Spring
应用程序上下文中使用的内置bean
作用域。这些相同的作用域也适用于spring boot
bean
作用域。
SCOPE | 描述 |
---|---|
singleton |
spring IoC 容器存在一个bean 对象实例。 |
prototype |
与单例相反,每次请求bean 时,它都会创建一个新实例。 |
request |
在HTTP 请求(Request ) 的完整生命周期中,将创建并使用单个实例。 只适用于web 环境中Spring ApplicationContext 中有效。 |
session |
在HTTP 会话(Session ) 的完整生命周期中,将创建并使用单个实例。 只适用于web 环境中Spring ApplicationContext 中有效。 |
application |
将在ServletContext 的完整生命周期中创建并使用单个实例。只适用于web 环境中Spring ApplicationContext 中有效。 |
websocket |
在WebSocket的完整生命周期中,将创建并使用单个实例。 只适用于web 环境中Spring ApplicationContext 中有效。 |
单例作用域
singleton
是spring
容器中bean的默认作用域。它告诉容器仅创建和管理一个bean
类实例。该单个实例存储在此类单例bean
的缓存中,并且对该命名bean
的所有后续请求和引用都返回该缓存的实例。
使用Java
配置的单例作用域bean
的示例:
@Component
@Scope("singleton") //可以省略,默认即是singleton
public class BeanClass {
}
使用XML
配置的单例作用域bean
的示例:
<!-- 后面的singleton可以省略 -->
<bean id="beanId" class="cn.howtodoinjava.BeanClass" scope="singleton" />
//or
<bean id="beanId" class="cn.howtodoinjava.BeanClass" />
原型作用域
每次应用程序对Bean
进行请求时,原型作用域都会创建一个新的Bean
实例。
您应该知道,销毁bean
生命周期方法不调用原型作用域bean
,只调用初始化回调方法。因此,作为开发人员,您要负责清理原型作用域的bean
实例以及其中包含的所有资源。
原型bean
范围的Java
配置示例:
@Component
@Scope("prototype")
public class BeanClass {
}
原型bean
范围的XML
配置示例:
<bean id="beanId" class="cn.howtodoinjava.BeanClass" scope="prototype" />
通常,您应该为所有有状态
bean
使用原型范围,为无状态bean
使用单例范围。
要在请求、会话、应用程序和
websocket
范围内使用bean
,您需要注册RequestContextListener
或RequestContextFilter
.
request作用域
在请求范围中,容器为每个HTTP
请求创建一个新实例。因此,如果服务器当前处理50个请求,那么容器最多可以有50个bean
类的单独实例。对一个实例的任何状态更改对其他实例都是不可见的。一旦请求完成,这些实例就会被销毁。
request
请求bean
范围的Java
配置示例:
@Component
@Scope("request")
public class BeanClass {
}
//or
@Component
@RequestScope
public class BeanClass {
}
request
请求bean
范围的XML
配置示例:
<bean id="beanId" class="cn.howtodoinjava.BeanClass" scope="request" />
session作用域
在会话范围中,容器为每个HTTP
会话创建一个新实例。因此,如果服务器有20个活动会话,那么容器最多可以有20个bean
类的单独实例。在单个会话生命周期内的所有HTTP
请求都可以访问该会话范围内相同的单个bean
实例。
在会话范围内,对一个实例的任何状态更改对其他实例都是不可见的。一旦会话在服务器上被销毁/结束,这些实例就会被销毁。
session
请求bean
范围的Java
配置示例:
@Component
@Scope("session")
public class BeanClass {
}
//or
@Component
@SessionScope
public class BeanClass {
}
session
请求bean
范围的XML
配置示例:
<bean id="beanId" class="cn.howtodoinjava.BeanClass" scope="session" />
application作用域
在应用程序范围内,容器为每个web
应用程序运行时创建一个实例。它几乎类似于单例范围,只有两个不同之处。即:
- 应用程序作用域
bean
是每个ServletContext
的单例对象,而单例作用域bean
是每个ApplicationContext
的单例对象。请注意,单个应用程序可能有多个应用程序上下文。 - 应用程序作用域
bean
作为ServletContext
属性可见。
application
bean
范围的Java
配置示例:
@Component
@Scope("application")
public class BeanClass {
}
//or
@Component
@ApplicationScope
public class BeanClass {
}
application
bean
范围的XML
配置示例:
<bean id="beanId" class="com.howtodoinjava.BeanClass" scope="application" />
websocket作用域
WebSocket
协议支持客户端和远程主机之间的双向通信,远程主机选择与客户端通信。WebSocket
协议为两个方向的通信提供了一个单独的TCP
连接。这对于具有同步编辑和多用户游戏的多用户应用程序特别有用。
在这种类型的Web
应用程序中,HTTP
仅用于初始握手。如果服务器同意,服务器可以以HTTP
状态101(交换协议)进行响应。如果握手成功,则TCP
套接字保持打开状态,客户端和服务器都可以使用该套接字向彼此发送消息。
websocket
bean
范围的Java
配置示例:
@Component
@Scope("websocket")
public class BeanClass {
}
websocket
bean
范围的XML
配置示例:
<bean id="beanId" class="com.howtodoinjava.BeanClass" scope="websocket" />
请注意,websocket
范围内的bean
通常是单例的,并且比任何单独的WebSocket
会话寿命更长。
自定义线程作用域
Spring
还使用类SimpleThreadScope
提供了非默认线程作用域。若要使用此作用域,必须使用CustomScopeConfigurer
类将其注册到容器。
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="thread">
<bean class="org.springframework.context.support.SimpleThreadScope"/>
</entry>
</map>
</property>
</bean>
对bean
的每个请求都将在同一线程中返回相同的实例。
线程bean
范围的Java
配置示例:
@Component
@Scope("thread")
public class BeanClass {
}
线程bean
范围的xml
配置示例:
<bean id="beanId" class="cn.howtodoinjava.BeanClass" scope="thread" />
总结
Spring framework
提供了六个Spring
bean
作用域,每个作用域内的实例具有不同的生命周期跨度。作为开发人员,我们必须明智地选择任何容器管理bean
的范围。同样,当具有不同作用域的bean
相互引用时,我们必须做出明智的决定。
请记住以上给出的所有信息来回答任何spring
bean
作用域的面试问题。
Spring系列四:Bean Scopes作用域的更多相关文章
- Spring基础11——Bean的作用域
1.Bean的作用域种类 Spring中的bean的作用域分为四种:singleton.prototype.session.request,后两种很少使用,下面我们主要来学习前两种 2.singlet ...
- (转)配置Spring管理的bean的作用域
http://blog.csdn.net/yerenyuan_pku/article/details/52833477 Spring管理的bean的作用域有: singleton 在每个Spring ...
- Spring学习四----------Bean的配置之Bean的配置项及作用域
© 版权声明:本文为博主原创文章,转载请注明出处 Bean的作用域(每个作用域都是在同一个Bean容器中) 1.singleton:单例,指一个Bean容器中只存在一份(默认) 2.prototype ...
- Spring框架系列(三)--Bean的作用域和生命周期
Bean的作用域 Spring应用中,对象实例都是在Container中,负责创建.装配.配置和管理生命周期(new到finalize()) Spring Container分为两种: 1.BeanF ...
- Spring系列(三) Bean装配的高级技术
profile 不同于maven的profile, spring的profile不需要重新打包, 同一个版本的包文件可以部署在不同环境的服务器上, 只需要激活对应的profile就可以切换到对应的环境 ...
- Spring系列之bean的使用
一.Bean的定义 <bean id="userDao" class="com.dev.spring.simple.MemoryUserDao"/> ...
- Spring 学习笔记 Bean的作用域
在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响.在低版本的Spring中,仅有两个作用域 ...
- Spring系列(四) 面向切面的Spring
除了IOC外, AOP是Spring的另一个核心. Spring利用AOP解决应用横切关注点(cross-cutting concern)与业务逻辑的分离, 目的是解耦合. 横切关注点是指散布于代码多 ...
- Spring系列(二) Bean装配
创建应用对象之间协作关系的行为称为装配(wiring), 这也是DI的本质. Spring中装配Bean的方式 Spring提供了三种装配Bean的方式. 隐式的Bean发现机制和自动装配 Java ...
随机推荐
- [pytorch] PyTorch Hook
PyTorch Hook¶ 为什么要引入hook? -> hook可以做什么? 都有哪些hook? 如何使用hook? 1. 为什么引入hook?¶ 参考:Pytorch中autogra ...
- 虚拟机扩展Linux根目录磁盘空间
简要扩展空间方法http://www.kwx.gd/CentOSApp/Xen-Centos6-Mounted-HardDrive.html 最近在VMware虚拟机上使用Centos,用着用着,发现 ...
- hdu5492
hdu5492 陈大哥的毒瘤题T1 题意: 差不多就是根据题意推式子,求最小方差. 解法: 首先,可以观察到,如果我们直接暴力去取平均数,很大概率会取出来小数,所以一个很直观的想法就是把平均数从式子里 ...
- 1.3 JAVA规范以及基础语法(if条件和循环)
一.规范以及运算符 1.命名规则 类名大驼峰规则方法名.变量名小驼峰原则常量大写.下划线分开见名释义.不与关键字冲突 关键字链接:https://www.runoob.com/java/java-ba ...
- Elasticsearch 部署以及报错解决
前言 Elasticsearch 是一个非常值得学习和使用的分布式存储 此次部署将采用 centos6.9 一.初步了解 ES 简谈概念 Elasticsearch 是一个开源的高扩展的分布式全文检索 ...
- synchronized对象解析
package com.haiyisoft.hyoaPc; public class Test7 { public static void main(String[] args) throws Int ...
- js函数节流和防抖的理解与实现
一:函数防抖1.理解:触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间2.思路:每次触发事件时都取消之前的延时调用方法 3.实现: function debounce ...
- Java并发包concurrent——ConcurrentHashMap
转: Java并发包concurrent——ConcurrentHashMap 2018年07月19日 20:43:23 Bill_Xiang_ 阅读数 16390更多 所属专栏: Java Conc ...
- rpm -qa|grep jdk
转:http://blog.csdn.net/u012110719/article/details/42002221 RPM是RedHat Package Manager(RedHat软件包管理工具) ...
- [Distributed ML] Yi WANG's talk
王益,分布式机器学习的践行者,他的足迹值得后来者学习. 膜拜策略: LinkedIn高级分析师王益:大数据时代的理想主义和现实主义(图灵访谈)[心路历程] 分布式机器学习的故事-王益[历史由来] 分布 ...