新闻详情

新闻详情

首页 / 资讯中心 / 详情

Spring 自动装配原理

发布时间:2026/9/7 11:04:11来源:尧图网络
Spring 自动装配原理
目录1、整体流程2、查找 Bean 规则Autowired① 优先按类型查找 byType情况 1容器中该类型只有 1 个 Bean → 直接注入。情况 2同类型多个 Bean多个实现类required 属性3、三种注入位置区别1字段注入不推荐2setter 方法注入3构造器注入Spring 官方推荐4、Resource 和 Autowired 对比高频面试5、核心源码链路精简6、循环依赖与自动装配7、常见坑面试简答版背自动装配Spring 根据类型自动在容器中查找 Bean完成依赖注入对应Autowired。 核心类AutowiredAnnotationBeanPostProcessor它是 Bean 后置处理器在 Bean 实例化完成之后、初始化之前执行依赖注入。1、整体流程Spring 启动扫描所有Autowired/Value注解由AutowiredAnnotationBeanPostProcessor解析。Bean 实例化构造器执行完成对象已经 new 出来。执行后置处理器postProcessProperties解析当前类的字段、set 方法上的 Autowired。根据依赖的类型去BeanFactory查找匹配 Bean。找到之后通过反射给字段 / 方法赋值完成注入。之后才执行PostConstruct、InitializingBean 初始化逻辑。⚠️ 关键点实例化 ≠ 初始化实例化new 对象自动装配依赖注入发生在实例化之后初始化之前。2、查找 Bean 规则Autowired① 优先按类型查找byTypejavaAutowired private UserService userService;去容器找UserService类型的 Bean。情况 1容器中该类型只有 1 个 Bean → 直接注入。情况 2同类型多个 Bean多个实现类按类型查到多个再用变量名字段名作为 beanName二次匹配。仍然匹配失败抛出NoUniqueBeanDefinitionException。此时可以搭配Qualifier(beanName)指定 bean 名称限定查找。javaAutowired Qualifier(userServiceImpl2) private UserService userService;required 属性Autowired(required false)requiredtrue默认找不到 Bean 直接抛异常。requiredfalse找不到就置为 null不报错。3、三种注入位置区别1字段注入不推荐javaAutowired private UserService userService;通过反射直接给 private 字段赋值。缺点循环依赖不易察觉、不利于单元测试、容易产生 NPE。2setter 方法注入javaAutowired public void setUserService(UserService userService){ this.userService userService; }解析 setXxx 方法参数类型查找 Bean 调用方法赋值。3构造器注入Spring 官方推荐Spring4.3 优化类只有一个构造函数时Autowired 可以省略自动构造器注入。javaAutowired public UserController(UserService userService){ this.userService userService; }注意构造器注入发生在实例化阶段对象还没 new 完成和字段 /set 注入时机不一样。4、Resource 和 Autowired 对比高频面试特性Autowired(Spring)Resource (JSR‑250 Java 标准)来源Spring 注解Java 官方默认规则byType类型优先再匹配 namebyName名字优先名字找不到退化成 byTyperequired支持requiredfalse不支持Qualifier配合使用使用namebeanNamejavaResource(nameuserServiceImpl1) private UserService userService;5、核心源码链路精简AutowiredAnnotationBeanPostProcessorpostProcessProperties()→ 入口findAutowiringMetadata()收集类上所有 Autowired 标记的字段、方法元数据InjectionMetadatainject()执行注入字段Field反射 set方法反射调用方法beanFactory.resolveDependency()核心方法解析依赖去容器查找 BeandoResolveDependency()findAutowireCandidates()根据 type 找到所有候选 Bean判断数量单个直接返回多个按字段名匹配 beanName冲突抛异常。6、循环依赖与自动装配构造器注入会直接循环依赖报错实例化阶段互相需要对方对象创建不出来。字段 /setter Autowired 可以解决循环依赖依靠 Spring 三级缓存。A 先实例化放入三级缓存A 需要 B开始创建 BB 又需要 A从缓存拿到半成品 AB 完成再注入 A完成装配。三级缓存只能解决singleton 单例、setter / 字段注入原型 prototype 不支持循环依赖。7、常见坑Autowired接口多个实现类忘记Qualifier→NoUniqueBeanDefinitionException。Autowired(requiredfalse)没判断 null运行 NPE。构造器多个构造函数不写AutowiredSpring 不知道选哪个构造器启动失败。this.xxx获取自动装配对象为 nullthis 是 new 出来的普通对象不是 Spring 容器 Bean不会走后置处理器注入。面试简答版背Autowired自动装配由AutowiredAnnotationBeanPostProcessor后置处理器实现。在 Bean 实例化完成之后解析字段、set 方法注解优先按类型 byType从容器查找 Bean如果找到多个同类型 Bean再使用字段名作为 beanName 匹配配合Qualifier可以显式指定 Bean 名称。required控制找不到是否抛异常。Resource是 Java 标准注解默认按名称 byName 查找找不到才降级按类型。 构造器注入如果只有一个构造器注解可以省略构造器注入无法解决循环依赖字段 setter 注入依靠三级缓存可以处理单例循环依赖。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

V100跑27B模型:nvfp4+vLLM+dflash2提速原理与部署 2026/9/7 11:52:28

V100跑27B模型:nvfp4+vLLM+dflash2提速原理与部署

上周帮一个朋友调 V100 跑 qwen3.8 27b 的时候,他第一句话是:“为什么网上有人说 4080 反而不支持 nvfp4?”这问题看着反直觉,其实背后是一个很真实的现状。V100 虽然发布得早,但因为二手价格低、32GB 显存大&#xff…

阅读更多 →
智能空开接入HomeAssistant:从硬件选型到自动化联动全记录 2026/9/7 11:52:28

智能空开接入HomeAssistant:从硬件选型到自动化联动全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Claude Code 实战指南:从 MCP 到 Hook,玩转终端 AI 编程助手 2026/9/7 11:52:28

Claude Code 实战指南:从 MCP 到 Hook,玩转终端 AI 编程助手

Claude Code 这段时间讨论度非常高。它是一个跑在终端里的 AI 编程助手,但我不想把它简单叫成聊天工具,因为它真正有价值的地方是能直接读项目、执行命令、调用外部工具,再通过 MCP、Agent Skill、Hook 这套机制把工作流固化下来。很多人一开…

阅读更多 →
单智能体工具调用型Agentic RAG:本地语料库问答架构实践 2026/9/7 11:52:28

单智能体工具调用型Agentic RAG:本地语料库问答架构实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Matlab中kalman函数用法详解:从教科书公式到LQG状态估计 2026/9/7 11:52:28

Matlab中kalman函数用法详解:从教科书公式到LQG状态估计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
实战派主任律师|张祝君:法理为基,实战制胜,全方位守护当事人合法权益 2026/9/7 11:49:27

实战派主任律师|张祝君:法理为基,实战制胜,全方位守护当事人合法权益

实战派主任律师|张祝君:法理为基,实战制胜,全方位守护当事人合法权益 一、个人资质与执业履历 张祝君律师,现任广东卡夫律师事务所主任律师,拥有10年以上专职律师执业经验,是深耕东莞本土法律服…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞