@Autowired
是 Spring 框架中實現依賴注入的核心注解,其自動裝配過程可分為以下步驟,結合了類型匹配、名稱解析和容器協作機制:
1. 組件掃描與 Bean 定義注冊
- 掃描階段:Spring 容器啟動時,通過
@ComponentScan
或 XML 配置掃描標記了@Component
、@Service
等注解的類,生成BeanDefinition
并注冊到容器中。 - 后置處理器注冊:容器會注冊
AutowiredAnnotationBeanPostProcessor
,專門處理@Autowired
注解的邏輯。
2. Bean 實例化與元數據預解析
- 實例化:容器根據
BeanDefinition
創建 Bean 實例(調用構造函數或工廠方法)。 - 預解析:在實例化后,
AutowiredAnnotationBeanPostProcessor
會掃描當前 Bean 的字段、方法和構造器,緩存@Autowired
標注的元數據(如依賴類型、名稱等)。
3. 依賴查找與注入
- 類型優先匹配:根據預解析的元數據,優先按依賴類型(如
UserService.class
)從容器中查找匹配的 Bean。- 單匹配:找到唯一 Bean 則直接注入。
- 多匹配沖突:若存在多個同類型 Bean,嘗試按字段/參數名稱匹配(如
userService
字段會查找名為userService
的 Bean)。 - 顯式指定:通過
@Qualifier("beanName")
指定具體 Bean 名稱解決歧義。
- 注入時機:通過反射或 setter 方法完成依賴注入。
4. 異常處理與可選依賴
- 異常情況:
- 無匹配 Bean 且
required=true
(默認):拋出NoSuchBeanDefinitionException
。 - 多匹配且未解決歧義:拋出
NoUniqueBeanDefinitionException
。
- 無匹配 Bean 且
- 可選依賴:設置
@Autowired(required=false)
允許依賴為空。
5. 完整流程示例
// 定義依賴 Bean
@Service
public class UserService { /* ... */ }// 使用 @Autowired 注入
@Component
public class OrderService {@Autowired // 按類型匹配 → UserServiceprivate UserService userService;
}
- 容器掃描到
OrderService
和UserService
的 Bean 定義。 - 實例化
OrderService
時,發現@Autowired
字段userService
。 - 按類型
UserService
查找并注入匹配的 Bean。
關鍵機制總結
機制 | 說明 |
---|---|
類型匹配 | 默認按字段/參數類型查找 Bean。 |
名稱降級 | 類型沖突時,嘗試按字段/參數名匹配。 |
后置處理器 | AutowiredAnnotationBeanPostProcessor 驅動解析和注入。 |
循環依賴處理 | 通過三級緩存解決(需避免構造器循環依賴)。 |
注:實際開發中推薦使用
@Autowired
結合@Qualifier
或 Lombok 的@RequiredArgsConstructor
簡化代碼。