">Spring Bean 作用域

我是基于ChatGPT-turbo-3.5实现的AI助手,在此网站上负责整理和概括文章

本文介绍了Spring框架中Bean作用域的概念及其配置方法。文章详细阐述了五种内置作用域:singleton(默认,单例)、prototype(原型,每次创建新实例)、request(请求作用域,存储于ServletRequest中)、session(会话作用域,存储于HttpSession中)以及application(应用作用域,存储于ServletContext中)。同时,还介绍了如何配置这些作用域(通过XML或注解),以及如何实现自定义作用域的方法。文章最后澄清了singleton Bean在不同Spring IoC容器中的状态差异,并指出application Bean与singleton Bean在某些场景下可视为等效。

# Spring Bean 作用域

# Spring Bean 作用域

来源 说明
singleton 默认 Spring Bean 作用域,一个 BeanFactory 有且仅有一个实例
prototype 原型作用域,每次依赖查找和依赖注入生成新 Bean 对象
request 将 Spring Bean 存储在 ServletRequest 上下文中
session 将 Spring Bean 存储在 HttpSession 中
application 将 Spring Bean 存储在 ServletContext 中

# "singleton" Bean 作用域

# "prototype" Bean 作用域

Spring 容器没有办法管理 prototype Bean 的完整生命周期,也没有办法记录实例的存在。销毁回调方法将不会执行,可以利用 BeanPostProcessor 进行清扫工作。

# "request" Bean 作用域

  • 配置
    • XML - <bean class="..." scope = “request" />
    • Java 注解 - @RequestScope@Scope(WebApplicationContext.SCOPE_REQUEST)
  • 实现
    • API - RequestScope

# "session" Bean 作用域

  • 配置
    • XML - <bean class="..." scope = “session" />
    • Java 注解 - @SessionScope@Scope(WebApplicationContext.SCOPE_SESSION)
  • 实现
    • API - SessionScope

# "application" Bean 作用域

  • 配置
    • XML - <bean class="..." scope = “application" />
    • Java 注解 - @ApplicationScope@Scope(WebApplicationContext.SCOPE_APPLICATION)
  • 实现
    • API - ServletContextScope

# 自定义 Bean 作用域

  • 实现 Scope

    • org.springframework.beans.factory.config.Scope
  • 注册 Scope

    • API - org.springframework.beans.factory.config.ConfigurableBeanFactory#registerScope
  • 配置

    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
      <property name="scopes">
        <map>
          <entry key="...">
          </entry>
        </map>
      </property>
    </bean>

# 问题

Spring 內建的 Bean 作用域有几种?

singleton、prototype、request、session、application 以及 websocket

singleton Bean 是否在一个应用是唯一的?

否。singleton bean 仅在当前 Spring IoC 容器(BeanFactory)中是单例对象。

application Bean 是否可以被其他方案替代?

可以的,实际上,“application” Bean 与“singleton” Bean 没有本质区别

# 参考资料

更新于

请我喝[茶]~( ̄▽ ̄)~*

Fulsun 微信支付

微信支付

Fulsun 支付宝

支付宝