题目
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作用域频繁创建实例可能影响性能,需权衡使用