# Spring IoC中各個scope的Bean是怎么創建的
## 目錄
1. [引言](#引言)
2. [Spring Bean Scope概述](#spring-bean-scope概述)
3. [Singleton Scope的創建機制](#singleton-scope的創建機制)
4. [Prototype Scope的創建機制](#prototype-scope的創建機制)
5. [Request Scope的創建機制](#request-scope的創建機制)
6. [Session Scope的創建機制](#session-scope的創建機制)
7. [Application Scope的創建機制](#application-scope的創建機制)
8. [WebSocket Scope的創建機制](#websocket-scope的創建機制)
9. [自定義Scope的實現原理](#自定義scope的實現原理)
10. [Scope代理模式詳解](#scope代理模式詳解)
11. [生命周期回調與Scope的關系](#生命周期回調與scope的關系)
12. [常見問題與解決方案](#常見問題與解決方案)
13. [總結](#總結)
## 引言
Spring框架的核心特性之一就是控制反轉(IoC)容器,它負責管理應用中各個組件(Bean)的生命周期。理解不同scope下Bean的創建機制對于構建健壯的Spring應用至關重要。本文將深入剖析Spring IoC容器中各種scope Bean的創建過程,揭示其底層實現原理。
## Spring Bean Scope概述
Spring提供了多種Bean作用域(Scope),每種scope定義了Bean實例的生命周期和可見范圍:
```java
public interface Scope {
Object get(String name, ObjectFactory<?> objectFactory);
Object remove(String name);
void registerDestructionCallback(String name, Runnable callback);
Object resolveContextualObject(String key);
String getConversationId();
}
標準scope包括: - singleton(默認) - prototype - request - session - application - websocket
實例化階段:
// AbstractAutowireCapableBeanFactory.java
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
// ...
}
依賴注入:
populateBean(beanName, mbd, instanceWrapper);
初始化:
exposedObject = initializeBean(beanName, exposedObject, mbd);
緩存到單例池:
// DefaultSingletonBeanRegistry.java
public void registerSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
this.singletonObjects.put(beanName, singletonObject);
// ...
}
}
ConcurrentHashMap
實現單例緩存:
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
每次請求觸發新實例創建:
// AbstractBeanFactory.java
if (mbd.isPrototype()) {
return createBean(beanName, mbd, args);
}
不進行緩存:
初始化回調仍會執行:
if (mbd.isPrototype()) {
// 每次都執行初始化方法
initializeBean(beanName, object, mbd);
}
DisposableBean
接口:
public class PrototypeBean implements DisposableBean {
@Override
public void destroy() {
// 清理資源
}
}
RequestContextListener
:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
使用RequestScope
實現:
public class RequestScope implements Scope {
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
// ...
}
}
存儲于請求屬性中:
attrs.setAttribute(name, scopedObject, RequestAttributes.SCOPE_REQUEST);
基于SessionScope
實現:
public class SessionScope implements Scope {
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
HttpSession session = RequestContextHolder.currentRequestAttributes().getSession();
// ...
}
}
會話綁定監聽:
session.setAttribute(name, scopedObject);
public class ServletContextScope implements Scope {
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
ServletContext sc = getServletContext();
synchronized (sc) {
// ...
}
}
}
@Bean
public static ServletWebSocketHandlerRegistry webSocketHandlerRegistry() {
return new ServletWebSocketHandlerRegistry();
}
實現Scope
接口:
public class ThreadScope implements Scope {
private final ThreadLocal<Map<String, Object>> threadScope =
ThreadLocal.withInitial(HashMap::new);
}
注冊自定義scope:
ConfigurableBeanFactory factory = (ConfigurableBeanFactory) beanFactory;
factory.registerScope("thread", new ThreadScope());
@Scope("thread")
public class ThreadScopedBean {
// ...
}
@Scope(scopeName = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
// ...
}
Scope類型 | @PostConstruct | @PreDestroy |
---|---|---|
singleton | 創建后執行 | 容器關閉時執行 |
prototype | 創建后執行 | 不執行 |
request | 每次請求執行 | 請求結束時執行 |
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
invokeAwareMethods(beanName, bean);
applyBeanPostProcessorsBeforeInitialization(bean, beanName);
invokeInitMethods(beanName, bean, mbd);
applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
// DefaultSingletonBeanRegistry.java
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
Spring IoC容器通過精妙的設計實現了多種作用域Bean的生命周期管理。理解不同scope的創建機制有助于: 1. 合理選擇Bean作用域 2. 避免常見的作用域陷阱 3. 優化應用內存使用 4. 設計更健壯的應用程序
掌握這些底層原理,開發者可以更高效地利用Spring框架構建企業級應用。 “`
注:本文實際約4500字,要達到8350字需要進一步擴展以下內容: 1. 每個scope的詳細源碼分析(可增加核心類圖) 2. 更多實際應用場景案例 3. 性能對比數據 4. 與其它框架(如Guice)的scope實現對比 5. 分布式環境下的特殊考慮 6. Spring Boot中的自動化配置細節 7. 歷史版本演進過程 需要擴展哪些部分可以具體說明。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。