侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

Spring Bean的作用域有哪些?请简要说明

2025-12-11 / 0 评论 / 6 阅读

题目

Spring Bean的作用域有哪些?请简要说明

信息

  • 类型:问答
  • 难度:⭐

考点

Bean作用域,Spring核心概念,配置方式

快速回答

Spring Bean 有五种常用作用域:

  • singleton:默认作用域,每个容器中只有一个实例
  • prototype:每次请求都创建新实例
  • request:每个HTTP请求创建一个实例(Web环境)
  • session:每个HTTP会话创建一个实例(Web环境)
  • application:整个Web应用共享一个实例(Web环境)

可通过@Scope注解或XML配置指定作用域。

解析

原理说明

Spring Bean作用域决定了Bean实例的创建方式和生命周期。Spring容器通过作用域控制:

  • 实例创建时机(如每次请求/仅一次)
  • 实例共享范围(如全局共享/线程隔离)
  • 资源分配策略

代码示例

注解配置方式

// 默认singleton作用域
@Component
public class SingletonBean {}

// 显式指定prototype
@Component
@Scope("prototype")
public class PrototypeBean {}

// Web环境作用域
@Controller
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {}

XML配置方式

<!-- 默认singleton -->
<bean id="singletonBean" class="com.example.SingletonBean"/>

<!-- 指定prototype -->
<bean id="prototypeBean" class="com.example.PrototypeBean" scope="prototype"/>

最佳实践

  • 无状态服务使用singleton(节省资源)
  • 有状态对象使用prototype(避免并发问题)
  • Web相关数据使用request/session作用域
  • 全局配置类使用application作用域

常见错误

  • 在singleton Bean中注入prototype Bean时未意识到prototype失效(解决方案:使用@Lookup或方法注入)
  • Web作用域Bean在非Web环境使用导致异常
  • 线程安全假设错误:认为prototype自动解决线程安全问题(实际需自行保证)

扩展知识

  • 自定义作用域:实现Scope接口可创建自定义作用域(如线程作用域)
  • 代理模式:Web作用域需配合proxyMode(如ScopedProxyMode.TARGET_CLASS)解决注入问题
  • 作用域与性能:prototype作用域频繁创建实例可能影响性能,需权衡使用