• Bean的作用域


    在Spring中,那些组成应用程序的主体及由Spring IOC容器所管理的对象,被称之为bean。简单地讲,bean就是由IOC容器初始化、装配及管理的对象。而这些对象,都有它对应的作用域。

    image-20210119154303431

    几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

    1、Singleton

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

    Singleton是单例类型,就是在创建容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象

    【注意】Singleton作用域是Spring中的缺省作用域。在我们不声明的情况下,默认就是Singleton

    我们也可以在xml中显示设置它

    <bean id="user" class="com.jh.domain.User" scope="singleton"/>
    

    Singleton的作用范围:

    singleton

    2、Prototype

    当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。

    Prototype是原型类型,它在我们创建容器的时候没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象

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

    在XMl中可以这样设置,将bean定位为prototype

    <bean id="user" class="com.jh.domain.User" scope="prototype" />
    

    prototype的作用范围:

    prototype

    3、Request

    当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例

    即每一个HTTP请求,都会单独创建一个bean,若请求结束,bean也会随之销毁。

    使用request作用域一般不会存在线程安全问题,因为在Web应用中,每个请求都是由一个单独的线程进行处理,所有线程之间并不会共享bean,从而不会存在线程安全的问题。

    如果使用的是注解扫描配置bean,那么在bean所属的类上使用@RequestScope注解即可使用此作用域,若是基于xml文件,则通过beanscope配置项:

    <bean id="loginAction" class="com.something.LoginAction" scope="request"/>
    

    4、Session

    Session作用域将bean的使用范围一次在一次http会话中,对于每一个会话,Spring容器都会创建一个单独的bean,若Session被销毁,则bean也随之销毁。

    针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。

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

    session作用域只能使用在Web应用中。我们可以使用@SessionScope将bean指定为session作用域,也可以使用xml配置方式:

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

    5、Application

    Spring 容器通过为整个 Web 应用程序使用一次 bean 定义来创建 bean 的新实例。也就是说,bean 在级别上进行范围范围存储,并存储为常规属性。

    这与 Spring Singleton Bean有些类似,但在两个重要方面有所不同:它是每个的单元,而不是每个 Spring"应用程序上下文"(对于它,在任何给定的 Web 应用程序中可能有多个),它实际上是公开的,因此作为属性可见。‎

    application作用域也只能用于web应用中。使用方式和之前几种类似,可以通过@ApplicationScope注解,也可以使用xml配置文件:

    <bean id="appPreferences" class="com.something.AppPreferences" scope="application"/>
    

    6、websocket

    websocket是一种应用层的通信协议,它提供应用层的全双工通信,而Spring提供对websocket协议的支持,于是就有了这么一个作用域。在Spring官方文档中,并没有对这个作用域进行详细描述,但是我们也可以通过名称推断出来。

    若一个bean的作用域为websocket,则只作用于一次websocket通信。若连接被释放,则bean也会被销毁。

    懂不懂,都是收获
  • 相关阅读:
    怎么为学生布置作业
    新学期的第一节Android课
    RUCSE小组博客列表
    test
    个人最终总结
    黄金点小游戏的设计与实现
    WordCount 程序的实现
    阅读下面程序,请回答如下问题:
    Visual Studio 2015的安装和简单的单元测试
    构建之法--软件工程学习随笔之二
  • 原文地址:https://www.cnblogs.com/paidaxing0623/p/14312206.html
Copyright © 2020-2023  润新知