@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
简化代码。