1. Spring Bean Scope 基础概念解析
在Spring框架中,Bean的作用域(Scope)决定了Bean实例的生命周期和可见范围。理解不同Scope的创建机制,是掌握Spring IoC容器核心原理的关键一步。作为从业十年的Java开发者,我见过太多因为Scope使用不当导致的内存泄漏和并发问题。
Spring默认提供了五种标准Scope:
- singleton:单例模式,容器中只存在一个共享实例
- prototype:原型模式,每次请求都创建新实例
- request:每个HTTP请求创建一个实例
- session:每个用户会话期间共享一个实例
- application:ServletContext生命周期内共享实例
重要提示:在Spring 5.x之后,还引入了websocket scope,用于长连接场景。但在实际项目中,前三种scope的使用频率占到了90%以上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Singleton Scope 的底层实现机制
2.1 核心创建流程
Singleton是Spring的默认Scope,其核心实现位于DefaultSingletonBeanRegistry类中。当容器启动时:
- 预实例化阶段(前提是配置了lazy-init=false):
java复制// AbstractApplicationContext.java
public void refresh() {
// ...
finishBeanFactoryInitialization(beanFactory); // 触发单例预初始化
// ...
}
- 实际创建过程通过三级缓存解决循环依赖:
java复制// DefaultSingletonBeanRegistry.java
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this.singletonFacto
