等闲识得东风面,万紫千红总是春。

概述

Spring框架中,我们可以在六个内置的spring bean作用域中创建bean,还可以定义bean范围。在这六个范围中,只有在使用支持WebapplicationContext时,其中四个可用。singletonprototype作用域可用于任何类型的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中有效。

单例作用域

singletonspring容器中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,您需要注册RequestContextListenerRequestContextFilter.

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应用程序运行时创建一个实例。它几乎类似于单例范围,只有两个不同之处。即:

  1. 应用程序作用域bean是每个ServletContext的单例对象,而单例作用域bean是每个ApplicationContext的单例对象。请注意,单个应用程序可能有多个应用程序上下文。
  2. 应用程序作用域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作用域的更多相关文章

  1. Spring基础11——Bean的作用域

    1.Bean的作用域种类 Spring中的bean的作用域分为四种:singleton.prototype.session.request,后两种很少使用,下面我们主要来学习前两种 2.singlet ...

  2. (转)配置Spring管理的bean的作用域

    http://blog.csdn.net/yerenyuan_pku/article/details/52833477 Spring管理的bean的作用域有: singleton 在每个Spring ...

  3. Spring学习四----------Bean的配置之Bean的配置项及作用域

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的作用域(每个作用域都是在同一个Bean容器中) 1.singleton:单例,指一个Bean容器中只存在一份(默认) 2.prototype ...

  4. Spring框架系列(三)--Bean的作用域和生命周期

    Bean的作用域 Spring应用中,对象实例都是在Container中,负责创建.装配.配置和管理生命周期(new到finalize()) Spring Container分为两种: 1.BeanF ...

  5. Spring系列(三) Bean装配的高级技术

    profile 不同于maven的profile, spring的profile不需要重新打包, 同一个版本的包文件可以部署在不同环境的服务器上, 只需要激活对应的profile就可以切换到对应的环境 ...

  6. Spring系列之bean的使用

    一.Bean的定义 <bean id="userDao" class="com.dev.spring.simple.MemoryUserDao"/> ...

  7. Spring 学习笔记 Bean的作用域

    在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响.在低版本的Spring中,仅有两个作用域 ...

  8. Spring系列(四) 面向切面的Spring

    除了IOC外, AOP是Spring的另一个核心. Spring利用AOP解决应用横切关注点(cross-cutting concern)与业务逻辑的分离, 目的是解耦合. 横切关注点是指散布于代码多 ...

  9. Spring系列(二) Bean装配

    创建应用对象之间协作关系的行为称为装配(wiring), 这也是DI的本质. Spring中装配Bean的方式 Spring提供了三种装配Bean的方式. 隐式的Bean发现机制和自动装配 Java ...

随机推荐

  1. jQuery系列(十三):实现轮播

    1.轮播一: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  2. POJ - 3376 Finding Palindromes manacher+字典树

    题意 给n个字符串,两两拼接,问拼接后的\(n\times n\)个字符串中有多少个回文串. 分析 将所有正串插入字典树中,马拉车跑出所有串哪些前缀和后缀为回文串,记录位置,用反串去字典树中查询,两字 ...

  3. deepin grub2017年11月13日折腾记录

    http://blog.csdn.net/atbird0321/article/details/78158194 https://bbs.deepin.org/forum.php?mod=viewth ...

  4. AcWing:238. 银河英雄传说(带权并查集)

    有一个划分为N列的星际战场,各列依次编号为1,2,…,N. 有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列. 有T条指令,每条指令格式为以下两种之一: 1.M i j,表示让第i号战 ...

  5. 5.rabbitmq--通配符模式Topics

    rabbitmq--通配符模式Topics topic模式也称为主题模式,其实他相对于routing模式最大的好处就是他多了一种匹配模式的路由,怎么理解匹配呢,其实就相当于我们之前正则的.*这种,不过 ...

  6. CountDownLatch和CylicBarrier以及Semaphare你使用过吗

    CountDownLatch 是什么 CountDownLatch的字面意思:倒计时 门栓 它的功能是:让一些线程阻塞直到另一些线程完成一系列操作后才唤醒. 它通过调用await方法让线程进入阻塞状态 ...

  7. ARTS打卡计划第十一周

    Algorithms: https://leetcode-cn.com/problems/linked-list-cycle/ 链表环. Review: “What I learned from do ...

  8. Netty使用(一)

    1.Netty介绍 Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架: 提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器 ...

  9. Java-JVM OutOfMemory 情况(JDK8)

    JVM 运行时内存结构(Run-Time Data Areas) 内存溢出分为两大类:OutOfMemoryError 和 StackOverflowError. 一.HeapOomError (JV ...

  10. UDDI:百科

    ylbtech-UDDI:百科 UDDI是一种用于描述.发现.集成Web Service的技术,它是Web Service协议栈的一个重要部分.通过UDDI,企业可以根据自己的需要动态查找并使用Web ...