Spring源碼主線全鏈路拆解:從啟動到關閉的完整生命周期
一文看懂 Spring 框架從啟動到銷毀的主線流程,結合原理、源碼路徑與偽代碼三位一體,系統學習 Spring 底層機制。
1. 啟動入口與環境準備
原理說明
- Spring Boot 應用入口是標準 Java 應用
main()
方法。 - 核心在
SpringApplication.run()
,創建上下文并發布初始化事件。
核心調用鏈
SpringApplication.run()
→prepareEnvironment()
→ 發布ApplicationEnvironmentPreparedEvent
偽代碼
public static void main(String[] args) {SpringApplication app = new SpringApplication(MainClass);app.run(args);
}SpringApplication.run():listeners = getRunListeners()listeners.starting()environment = prepareEnvironment()listeners.environmentPrepared(environment)
2. 資源加載與配置解析
原理說明
- 讀取配置文件(
.properties
,.yml
) - 激活不同
Profile
,構建Environment
核心調用鏈
ConfigFileApplicationListener
監聽器加載配置- 處理
PropertySource
、Profile
偽代碼
prepareEnvironment():env = new StandardEnvironment()loadPropertySources(env)applyActiveProfiles(env)return env
3. BeanDefinition 加載與注冊
原理說明
- 將類、配置文件中的 Bean 定義加載為
BeanDefinition
- 注冊至
BeanFactory
核心調用鏈
AnnotationConfigApplicationContext.register()
注冊啟動類refresh()
中調用invokeBeanFactoryPostProcessors()
→ 加載并注冊BeanDefinition
偽代碼
createApplicationContext():context = new AnnotationConfigApplicationContext()context.register(MainClass)return contextrefresh():invokeBeanFactoryPostProcessors()registerBeanPostProcessors()scanAndRegisterBeanDefinitions()
4. BeanFactory 后處理器執行
原理說明
- 在
BeanFactory
初始化后、Bean 實例化前進行增強 - 用于修改或替換 BeanDefinition,如配置屬性解析
核心調用鏈
invokeBeanFactoryPostProcessors()
遍歷執行BeanFactoryPostProcessor
&BeanDefinitionRegistryPostProcessor
偽代碼
invokeBeanFactoryPostProcessors(beanFactory):for processor in beanFactory.getPostProcessors():processor.postProcessBeanFactory(beanFactory)
5. Bean 實例化與依賴注入
原理說明
- 執行 Bean 實例創建與依賴注入
- 使用三級緩存解決循環依賴
核心調用鏈
getBean()
→doCreateBean()
→populateBean()
注入依賴
偽代碼
getBean(name):if name in singletonObjects:return singletonObjects[name]if name in earlySingletonObjects:return earlySingletonObjects[name]if name in singletonFactories:instance = singletonFactories[name].getObject()earlySingletonObjects[name] = instancereturn instancebean = doCreateBean(name)singletonObjects[name] = beanreturn bean
6. Bean 初始化與增強
原理說明
- 通過
BeanPostProcessor
實現初始化增強 - 支持
@PostConstruct
,InitializingBean
,Aware
接口等回調機制
核心調用鏈
initializeBean()
→ 多種前后置處理器調用
偽代碼
initializeBean(bean):bean = applyBeanPostProcessorsBeforeInitialization(bean)if bean instanceof Aware:bean.setXXX(...)if bean instanceof InitializingBean:bean.afterPropertiesSet()callPostConstruct(bean)bean = applyBeanPostProcessorsAfterInitialization(bean)return bean
7. AOP 代理織入
原理說明
- 動態代理目標 Bean,織入切面邏輯
- 支持 JDK 動態代理(接口)和 CGLIB(類繼承)
核心調用鏈
AbstractAutoProxyCreator
實現BeanPostProcessor
wrapIfNecessary()
判斷是否需要代理 → 創建代理
偽代碼
if isAopProxyRequired(bean):proxy = createAopProxy(bean)return proxy
else:return beancreateAopProxy(bean):if bean implements interface:return JdkDynamicProxy(bean, advisors)else:return CglibProxy(bean, advisors)
8. 事件發布與監聽
原理說明
- Spring 支持應用內事件發布/監聽機制
- 可同步或異步觸發事件處理邏輯
核心調用鏈
ApplicationEventPublisher.publishEvent()
→SimpleApplicationEventMulticaster.multicastEvent()
偽代碼
publishEvent(event):for listener in multicaster.getListeners(event):if async:threadPool.submit(() -> listener.onEvent(event))else:listener.onEvent(event)
9. 事務聲明與 AOP 增強
原理說明
- 使用
@Transactional
聲明事務 - AOP 攔截器在方法執行前后控制事務邊界
核心調用鏈
TransactionInterceptor.invoke()
→PlatformTransactionManager
開啟/提交/回滾事務
偽代碼
invoke(method, args):if method has @Transactional:beginTransaction()try:result = method.invoke(args)commitTransaction()return resultexcept Exception:rollbackTransaction()throwelse:return method.invoke(args)
10. 容器刷新與生命周期管理
原理說明
refresh()
負責初始化容器各組件destroy()
觸發銷毀邏輯、調用相關回調
核心調用鏈
AbstractApplicationContext.refresh()
→ 調用多個初始化方法close()
→ 發布關閉事件,銷毀 Bean
偽代碼
refresh():prepareBeanFactory()invokeBeanFactoryPostProcessors()registerBeanPostProcessors()initMessageSource()initApplicationEventMulticaster()onRefresh()registerListeners()finishBeanFactoryInitialization()publishEvent(ContextRefreshedEvent)destroy():for bean in disposableBeans:bean.destroy()
11. SPI 與自動擴展機制
原理說明
- 使用
spring.factories
加載接口實現類 - 實現組件解耦與自動集成(如自動裝配)
核心調用鏈
SpringFactoriesLoader.loadFactoryNames()
加載所有擴展類SpringApplication
中調用自動裝配邏輯
偽代碼
loadSpringFactories(class):urls = getResources('META-INF/spring.factories')for url in urls:for entry in url:if entry.key == class.name:instances.add(newInstance(entry.value))return instances
12. 容器關閉與資源釋放
原理說明
- Spring 注冊 JVM 關閉鉤子,確保資源釋放
- 調用銷毀方法、釋放外部連接等資源
核心調用鏈
context.registerShutdownHook()
注冊鉤子close()
→ 銷毀 Bean、發布關閉事件
偽代碼
registerShutdownHook():Runtime.getRuntime().addShutdownHook(new Thread(() -> context.close()))close():publishEvent(ContextClosedEvent)destroyBeans()releaseResources()
🧠 總結:記憶口訣
啟動 run 環境前,listeners 事件先上演;
配置加載屬性合,Profiles 激活不能漏;
Bean 定義工廠后,三層緩存破死鎖;
初始化加增強,Aware 構造都上場;
AOP 切面織代理,JDK CGLIB 二選一;
事件機制多線程,監聽發布全響應;
事務增強控邊界,異常回滾不出界;
刷新容器搞初始化,銷毀鉤子穩收場;
SPI 自動擴展巧,factories 加持少不了;
優雅關機釋放清,Spring 框架全打通。
如需進一步深入某一模塊的 源碼行級分析(如 BeanFactory 的三級緩存實現細節、事務攔截器如何處理回滾),歡迎留言指定模塊!我可以繼續細拆每個關鍵類與方法邏輯。