Spring Boot項目中Spring容器原理解析
拆解一個具體的spring-boot-crud-demo項目作為示例,嘗試找出Spring核心容器原理在實際項目中的應(yīng)用。
1. 項目結(jié)構(gòu)
src/main/java/com/example/demo/ ├── SpringBootCrudDemoApplication.java # 主啟動類 ├── User.java # 實體類 ├── UserController.java # 控制器 └── UserRepository.java # 數(shù)據(jù)訪問接口
2. ApplicationContext容器啟動過程

2.1 啟動入口:主啟動類
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootCrudDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootCrudDemoApplication.class, args);
}
}2.2 啟動過程詳解

2.2.1 階段一:容器初始化
當(dāng)我們運(yùn)行SpringApplication.run()方法時:
- 創(chuàng)建
AnnotationConfigServletWebServerApplicationContext實例(Web環(huán)境下的ApplicationContext實現(xiàn)) - 加載
@SpringBootApplication注解中的配置信息 - 初始化
DefaultListableBeanFactory作為底層Bean工廠 - 注冊Spring Boot內(nèi)置的
BeanPostProcessor,如自動代理創(chuàng)建器、配置屬性綁定處理器等
2.2.2 階段二:Bean定義加載
- 組件掃描:
@SpringBootApplication包含@ComponentScan,會掃描當(dāng)前包及其子包- 掃描到
UserController(@RestController是@Component的特化) - 不會掃描到
UserRepository,因為它是接口
- 掃描到
- 自動配置:
@SpringBootApplication包含@EnableAutoConfiguration,會加載:- Spring Data JPA自動配置(
HibernateJpaAutoConfiguration) - Spring Web MVC自動配置(
WebMvcAutoConfiguration) - 嵌入式Web服務(wù)器自動配置(
TomcatServletWebServerFactoryAutoConfiguration)等
- Spring Data JPA自動配置(
- BeanDefinition注冊:
- 注冊
UserController的BeanDefinition - 自動配置類注冊大量內(nèi)置BeanDefinition,如
DispatcherServlet、DataSource、EntityManagerFactory等 UserRepository通過@EnableJpaRepositories(由@SpringBootApplication間接導(dǎo)入)被動態(tài)代理并注冊
- 注冊
2.2.3 階段三:Bean實例化與初始化
- 實例化Bean:
- 調(diào)用
UserController的無參構(gòu)造方法創(chuàng)建實例 - 創(chuàng)建
DataSource、EntityManagerFactory等基礎(chǔ)組件實例 - 為
UserRepository創(chuàng)建動態(tài)代理實例
- 調(diào)用
- 依賴注入:
@Autowired private UserRepository userRepository;
- 容器將
UserRepository的代理實例注入到UserController的userRepository字段中
- 容器將
- 初始化:
- 調(diào)用
UserController的初始化方法(如果有) - 應(yīng)用
BeanPostProcessor的處理,如AOP代理、事務(wù)增強(qiáng)等
- 調(diào)用
2.2.4 階段四:容器啟動完成
- 發(fā)布
ContextRefreshedEvent事件 - 啟動嵌入式Tomcat服務(wù)器
- 注冊請求映射(如
UserController中的@RequestMapping) - 應(yīng)用準(zhǔn)備就緒,開始處理HTTP請求
3. 依賴注入原理

3.1 字段注入示例
在UserController中,我們使用了字段注入:
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserRepository userRepository;
// ...
}
3.2 依賴注入過程詳解
- 依賴解析:
- 容器在實例化
UserController后,發(fā)現(xiàn)userRepository字段上有@Autowired注解 - 確定依賴類型為
UserRepository
- 容器在實例化
- 依賴查找:
- 容器在Bean工廠中查找
UserRepository類型的Bean - 由于
UserRepository是接口,容器會查找其實現(xiàn)類或代理類 - 找到由Spring Data JPA創(chuàng)建的動態(tài)代理實例
- 容器在Bean工廠中查找
- 依賴注入:
- 使用反射技術(shù),將
UserRepository的代理實例賦值給UserController的userRepository字段 - 完成注入后,
UserController就可以使用userRepository來操作數(shù)據(jù)了
- 使用反射技術(shù),將
3.3 依賴注入的優(yōu)勢
在這個項目中,我們可以看到依賴注入的實際優(yōu)勢:
- 松耦合:
UserController不需要關(guān)心UserRepository的具體實現(xiàn) - 可測試性:在單元測試中,可以輕松替換
UserRepository為模擬實現(xiàn) - 代碼簡潔:不需要手動創(chuàng)建
UserRepository實例
4. 核心組件在項目中的具體體現(xiàn)
4.1 BeanFactory
- 實現(xiàn)類:
DefaultListableBeanFactory - 作用:管理項目中所有的Bean,包括
UserController、UserRepository代理、DataSource等 - 位置:作為
AnnotationConfigServletWebServerApplicationContext的底層實現(xiàn)
4.2 ApplicationContext
- 實現(xiàn)類:
AnnotationConfigServletWebServerApplicationContext - 作用:提供完整的容器功能,包括Web應(yīng)用支持、事件發(fā)布、資源訪問等
- 位置:通過
SpringApplication.run()方法創(chuàng)建并返回
4.3 BeanDefinition
UserController的BeanDefinition:- 類名:
com.example.demo.UserController - 作用域:默認(rèn)單例
- 注解:
@RestController、@RequestMapping等 - 依賴:
UserRepository
- 類名:
UserRepository的BeanDefinition:- 類名:
com.example.demo.UserRepository - 類型:接口
- 實現(xiàn):由Spring Data JPA動態(tài)生成
- 類名:
4.4 BeanPostProcessor
AutowiredAnnotationBeanPostProcessor:處理@Autowired注解,實現(xiàn)依賴注入JpaRepositoryFactoryBean:創(chuàng)建UserRepository的代理實例TransactionAnnotationBeanPostProcessor:處理@Transactional注解,實現(xiàn)事務(wù)管理
5. 實際運(yùn)行流程
當(dāng)我們訪問http://localhost:8080/api/users時:
- 瀏覽器發(fā)送HTTP GET請求到Tomcat服務(wù)器
- Tomcat將請求轉(zhuǎn)發(fā)給Spring MVC的
DispatcherServlet DispatcherServlet查找匹配的處理器,找到UserController的getAllUsers()方法DispatcherServlet調(diào)用UserController實例的getAllUsers()方法- 在方法內(nèi)部,
UserController使用注入的userRepository調(diào)用findAll()方法 userRepository的代理實例將請求轉(zhuǎn)發(fā)給底層的JPA實現(xiàn)- JPA執(zhí)行SQL查詢,從H2數(shù)據(jù)庫獲取所有用戶數(shù)據(jù)
- 結(jié)果逐層返回,最終響應(yīng)給瀏覽器
6. 總結(jié)
通過spring-boot-crud-demo項目,可以清晰地看到Spring核心容器在實際項目中的應(yīng)用:
- ApplicationContext啟動:從
@SpringBootApplication注解開始,經(jīng)歷容器初始化、Bean定義加載、Bean實例化與初始化、容器啟動完成四個階段 - 依賴注入:通過
@Autowired實現(xiàn)Bean之間的依賴注入,如UserController依賴UserRepository - 核心組件:BeanFactory管理Bean,ApplicationContext提供完整容器功能,BeanDefinition定義Bean元數(shù)據(jù),BeanPostProcessor增強(qiáng)Bean功能
到此這篇關(guān)于Spring Boot項目中Spring核心容器原理詳解的文章就介紹到這了,更多相關(guān)springboot項目spring容器原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java volatile 內(nèi)存屏障底層原理語義
為了保證內(nèi)存可見性,java 編譯器在生成指令序列的適當(dāng)位置會插入內(nèi)存屏障指令來禁止特定類型的處理器重排序。為了實現(xiàn) volatile 內(nèi)存語義,JMM 會分別限制這兩種類型的重排序類型2021-09-09
Spring Schedule Task動態(tài)改寫Cron配置方式
這篇文章主要介紹了Spring Schedule Task動態(tài)改寫Cron配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringCloud Sleuth實現(xiàn)分布式請求鏈路跟蹤流程詳解
這篇文章主要介紹了SpringCloud Sleuth實現(xiàn)分布式請求鏈路跟蹤流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-11-11
淺析Java中如何處理接口返回的JSON數(shù)據(jù)
在?Java?里處理接口返回的?JSON,最常用的是?Jackson?或?Gson?這兩個庫,下面小編將用最簡單,最實用的方式教你,快跟隨小編一起學(xué)習(xí)一下吧2026-04-04
SpringBoot 動態(tài)配置Profile環(huán)境的方式
這篇文章主要介紹了SpringBoot 動態(tài)配置Profile環(huán)境的方式,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10

