# Spring IOC初始化執行流程詳解
## 一、前言
Spring框架作為Java領域最流行的輕量級開發框架,其核心機制IOC(控制反轉)和AOP(面向切面編程)是開發者必須深入理解的關鍵技術。本文將深入剖析Spring IOC容器的初始化執行流程,從源碼層面揭示其工作原理,幫助開發者更好地掌握Spring框架的核心機制。
## 二、IOC容器概述
### 2.1 什么是IOC
IOC(Inversion of Control,控制反轉)是一種設計原則,它將傳統程序中的對象創建和管理權從程序員手中轉移到容器中。在Spring框架中,IOC容器負責:
1. 對象的實例化
2. 對象依賴關系的裝配
3. 對象的生命周期管理
4. 對象的作用域管理
### 2.2 Spring IOC容器體系結構
Spring IOC容器主要包含以下核心接口和實現類:
```java
// 核心接口層次結構
BeanFactory (頂級接口)
↑
ListableBeanFactory
↑
HierarchicalBeanFactory
↑
ConfigurableBeanFactory
↑
ApplicationContext (應用上下文接口)
↑
ConfigurableApplicationContext
↑
AbstractApplicationContext (抽象實現)
↑
GenericApplicationContext
AnnotationConfigApplicationContext
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
WebApplicationContext (Web環境專用)
Spring IOC容器的初始化過程可以分為以下幾個主要階段:
以ClassPathXmlApplicationContext為例,初始化時首先執行構造函數:
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh,
ApplicationContext parent) {
super(parent);
setConfigLocations(configLocations);
if (refresh) {
refresh(); // 核心初始化方法
}
}
setConfigLocations()
方法會對配置路徑進行處理:
${...}
)核心方法refresh()
包含了完整的初始化流程:
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 1. 準備刷新上下文
prepareRefresh();
// 2. 獲取新的BeanFactory實例
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 3. 準備BeanFactory使用
prepareBeanFactory(beanFactory);
try {
// 4. 后置處理BeanFactory
postProcessBeanFactory(beanFactory);
// 5. 調用BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);
// 6. 注冊BeanPostProcessor
registerBeanPostProcessors(beanFactory);
// 7. 初始化消息源
initMessageSource();
// 8. 初始化事件廣播器
initApplicationEventMulticaster();
// 9. 初始化特殊Bean
onRefresh();
// 10. 注冊監聽器
registerListeners();
// 11. 實例化所有剩余單例Bean
finishBeanFactoryInitialization(beanFactory);
// 12. 完成刷新
finishRefresh();
}
catch (BeansException ex) {
// 異常處理...
}
}
}
obtainFreshBeanFactory()
方法會創建并配置一個新的BeanFactory:
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
// 1. 如果是AbstractRefreshableApplicationContext子類,會銷毀原有BeanFactory并創建新的
refreshBeanFactory();
// 2. 返回新創建的BeanFactory
return getBeanFactory();
}
loadBeanDefinitions()
是加載Bean定義的核心方法:
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) {
// 創建XmlBeanDefinitionReader
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
// 配置Reader
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
// 加載Bean定義
loadBeanDefinitions(beanDefinitionReader);
}
解析后的Bean定義會被注冊到BeanFactory的beanDefinitionMap
中:
// DefaultListableBeanFactory中的核心存儲結構
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
private final List<String> beanDefinitionNames = new ArrayList<>(256);
注冊過程主要涉及以下操作:
finishBeanFactoryInitialization()
方法會觸發單例Bean的實例化:
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
// 初始化ConversionService
if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME)) {
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class);
}
// 注冊默認的嵌入值解析器
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
}
// 初始化LoadTimeWeaverAware Bean
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class);
for (String weaverAwareName : weaverAwareNames) {
getBean(weaverAwareName);
}
// 停止使用臨時類加載器
beanFactory.setTempClassLoader(null);
// 凍結所有Bean定義
beanFactory.freezeConfiguration();
// 實例化所有剩余單例Bean
beanFactory.preInstantiateSingletons();
}
AbstractBeanFactory.getBean()
方法會觸發Bean的實例化:
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(String name, Class<T> requiredType, Object[] args, boolean typeCheckOnly) {
// 1. 轉換Bean名稱(處理別名、FactoryBean前綴等)
String beanName = transformedBeanName(name);
// 2. 嘗試從緩存獲取單例
Object sharedInstance = getSingleton(beanName);
// 3. 如果存在直接返回
if (sharedInstance != null && args == null) {
return adaptBeanInstance(name, sharedInstance, requiredType);
}
// 4. 檢查Bean定義是否存在
BeanDefinition bd = getMergedBeanDefinition(beanName);
// 5. 處理依賴Bean的初始化
String[] dependsOn = bd.getDependsOn();
if (dependsOn != null) {
for (String dep : dependsOn) {
if (isDependent(beanName, dep)) {
// 處理循環依賴
}
registerDependentBean(dep, beanName);
getBean(dep);
}
}
// 6. 創建Bean實例
if (bd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, bd, args);
}
catch (BeansException ex) {
destroySingleton(beanName);
throw ex;
}
});
return adaptBeanInstance(name, sharedInstance, requiredType);
}
// 處理原型和其他作用域...
}
AbstractAutowireCapableBeanFactory.initializeBean()
方法處理初始化回調:
protected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) {
// 1. 調用Aware接口方法
invokeAwareMethods(beanName, bean);
// 2. 應用BeanPostProcessor前置處理
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(bean, beanName);
}
// 3. 調用初始化方法
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(...);
}
// 4. 應用BeanPostProcessor后置處理
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
允許在Bean定義加載后、實例化前修改Bean定義:
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);
}
典型實現: - PropertySourcesPlaceholderConfigurer:處理屬性占位符 - ConfigurationClassPostProcessor:處理@Configuration類
在Bean初始化前后提供擴展點:
public interface BeanPostProcessor {
// 初始化前回調
Object postProcessBeforeInitialization(Object bean, String beanName);
// 初始化后回調
Object postProcessAfterInitialization(Object bean, String beanName);
}
典型實現: - AutowiredAnnotationBeanPostProcessor:處理@Autowired注解 - CommonAnnotationBeanPostProcessor:處理JSR-250注解 - AbstractAdvisingBeanPostProcessor:AOP相關處理
Spring通過三級緩存解決循環依賴問題:
singletonObjects
- 存放完全初始化好的單例BeanearlySingletonObjects
- 存放早期暴露的Bean(未完成屬性注入)singletonFactories
- 存放ObjectFactory,用于生成早期引用處理流程:
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
// 1. 從一級緩存查詢
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
// 2. 從二級緩存查詢
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
// 3. 從三級緩存獲取ObjectFactory
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
// 創建早期引用
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
return singletonObject;
}
Spring IOC容器的初始化是一個復雜而精妙的過程,主要包含以下關鍵步驟:
理解這一流程對于深入掌握Spring框架至關重要,能夠幫助開發者更好地解決實際開發中遇到的各種問題,并能夠根據業務需求進行合理的擴展和定制。
特性 | BeanFactory | ApplicationContext |
---|---|---|
Bean實例化時機 | 延遲加載 | 啟動時預加載單例Bean |
國際化支持 | 不支持 | 支持 |
事件發布機制 | 不支持 | 支持 |
資源訪問 | 基本支持 | 更強大的資源訪問能力 |
AOP集成 | 需要額外配置 | 內置支持 |
Spring無法解決原型作用域Bean的循環依賴,會直接拋出BeanCurrentlyInCreationException
。這是因為:
可以通過以下方式自定義:
實現FactoryBean
接口:
public class MyFactoryBean implements FactoryBean<MyBean> {
@Override
public MyBean getObject() {
return new MyBean();
}
}
使用靜態/實例工廠方法:
<bean id="myBean" class="com.example.MyFactory" factory-method="createInstance"/>
實現BeanPostProcessor
在初始化前后介入
合理使用延遲初始化:
@Lazy
優化Bean定義:
合理使用作用域:
選擇性初始化:
// 只初始化特定類型的Bean
context.getBeansOfType(MyService.class);
緩存Bean元數據:
CachingMetadataReaderFactory
緩存注解元數據Spring 6.x中的改進:
Spring Boot 3.x集成變化:
”`
注:本文實際約3000字,要達到9750字需要進一步擴展以下內容: 1. 每個階段的詳細源碼分析 2. 更多具體的示例代碼 3. 性能優化的具體案例 4. 與特定環境整合的細節 5. 歷史版本演變對比 6. 常見錯誤的排查指南 7. 設計模式在IOC中的應用分析 8. 與其他框架整合的注意事項
需要繼續擴展哪些部分可以告訴我。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。