当前位置: 首页 > news >正文

Spring @Autowired 依赖注入全解析

@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
  • 可选依赖:设置 @Autowired(required=false) 允许依赖为空。

5. 完整流程示例

// 定义依赖 Bean
@Service
public class UserService { /* ... */ }// 使用 @Autowired 注入
@Component
public class OrderService {@Autowired  // 按类型匹配 → UserServiceprivate UserService userService;
}
  1. 容器扫描到 OrderServiceUserService 的 Bean 定义。
  2. 实例化 OrderService 时,发现 @Autowired 字段 userService
  3. 按类型 UserService 查找并注入匹配的 Bean。

关键机制总结

机制说明
类型匹配默认按字段/参数类型查找 Bean。
名称降级类型冲突时,尝试按字段/参数名匹配。
后置处理器AutowiredAnnotationBeanPostProcessor 驱动解析和注入。
循环依赖处理通过三级缓存解决(需避免构造器循环依赖)。

注:实际开发中推荐使用 @Autowired 结合 @Qualifier 或 Lombok 的 @RequiredArgsConstructor 简化代码。

http://www.lryc.cn/news/572397.html

相关文章:

  • 语音情感识别:CNN-LSTM 和注意力增强 CNN-LSTM 模型的比较分析
  • Hive优化详细讲解
  • Redis 的优势有哪些,它是CP 还是 AP?CAP 理论又是什么?
  • C#的泛型和匿名类型
  • Ubuntu最新版本(Ubuntu22.04LTS)安装nfs服务器
  • Java八股文——计算机网络「传输层篇」
  • CppCon 2017 学习:Everything You Ever Wanted to Know about DLLs
  • CppCon 2017 学习:dynamic_cast from scratch
  • 【AJAX 实战】图书管理系统上 渲染图书列表+新增图书+删除图书
  • windows系统JDK1.8 与JDK 17切换
  • css3 文本效果(text-shadow、text-overflow、word-wrap、word-break)文本阴影、文本换行、文本溢出并隐藏显示省略号
  • 数据结构 6(算法)
  • CMake实践:指定gcc版本编译和交叉编译
  • 华为OD机试-最佳植树距离-二分(JAVA 2025A卷)
  • DeserializationViewer使用说明
  • Java并发编程实战 Day 29:大数据处理的并行计算模型
  • Arduino Nano 33 BLE Sense Rev 2开发板使用指南之【环境搭建 / 点灯】
  • FPGA基础 -- Verilog 命名事件
  • React 19中如何向Vue那样自定义状态和方法暴露给父组件。
  • 什么是Spark
  • 服务器如何从http升级到https(nginx)
  • Kaggle-Plant Seedlings Classification-(多分类+CNN+图形处理)
  • HashMap算法高级应用实战:频率类子数组问题的5种破解模式
  • ThreadLocal以及内存泄露原理的源码解析
  • NodeJS 对接 Outlook 发信服务器实现发信功能
  • 视频汇聚EasyCVR平台v3.7.2发布:新增全局搜索、播放器默认解码方式等4大功能
  • Python PyMySQL【mysql适配器】 简介
  • leetcode:461. 汉明距离(python3解法,数学相关算法题)
  • 在 Mac 上配置 Charles,抓取 iOS 手机端接口请求
  • wordpress小语种网站模板