type
status
date
slug
summary
tags
category
icon
password
 
下面用最白话、最接地气的方式,把 @Autowired 给你讲清楚。 看完你应该能回答:它是干嘛的?什么时候用?为什么不用 new?

@Autowired 详解


一句话先记住

@Autowired = 让 Spring 帮你创建对象,并自动“塞”进来用
你不用 new,Spring 帮你干。

一、没有 @Autowired 时你是怎么写代码的?

传统写法(不推荐)

这样写的问题

OrderService 强依赖 UserService ❌ 不方便测试 ❌ 不利于扩展(以后换实现很麻烦)

二、用了 @Autowired 之后(推荐)

这句话等价于什么?

👉 你对 Spring 说:
“这个 UserService,你帮我准备好,我要用”

三、Spring 到底帮你做了什么?

Spring 启动时,做了 3 件事

1️⃣ 扫描项目 2️⃣ 找到 @Component / @Service / @Repository / @Controller 3️⃣ 创建对象,放进 Spring 容器
📦 Spring 容器 = 超级对象仓库

@Autowired 的本质

从 Spring 容器中,拿一个合适的对象,自动注入进来

四、一个生活化比喻(很好记)

场景:点外卖 🍱

  • 你(OrderService)
  • 外卖平台(Spring)
  • 外卖(UserService)

❌ 不用 @Autowired

= 👉 你自己下厨做饭

✅ 用 @Autowired

= 👉 你告诉平台: 👉 “我要一份 UserService”

五、@Autowired 常见使用方式(重点)

1️⃣ 属性注入(最常见)

👍 简单 ⚠️ 不推荐在重要业务中大量使用(测试不方便)

2️⃣ 构造方法注入(最推荐 ⭐)

为什么推荐?

  • 依赖 必须有
  • 对象一创建就完整
  • 非常适合单元测试
👉 真实项目里,优先用这个

3️⃣ Setter 注入(了解即可)

适合:
  • 依赖是可选的

六、@Autowired 按什么规则找对象?

规则顺序(面试常问)

1️⃣ 先按类型找 2️⃣ 如果有多个 → 按名字找 3️⃣ 还不行 → 报错 ❌

示例:多个实现时会报错


解决办法 1:@Qualifier(常用)


解决办法 2:@Primary

👉 默认就用它

七、@Autowired(required = false) 是干嘛的?

意思是:
“有就注入,没有也不报错”
常见场景:
  • 监控
  • 插件
  • 可选功能

八、常见错误(初级最容易踩)

❌ 忘了加 @Service

Spring 根本不知道它是谁 👉 注入必失败

❌ 自己 new 还想 Autowired

❌ Spring 不管你自己 new 的对象 👉 @Autowired 不会生效

九、什么时候不能用 @Autowired

场景
原因
static 变量
Spring 管不了
new 出来的对象
不在容器里
普通工具类
建议用静态方法

十、给工程师的终极记忆口诀

对象交给 Spring 管需要用的地方加 @Autowired不要自己 new

十一、小结

@Autowired 是 Spring 的依赖注入注解,用来从 Spring 容器中自动注入 Bean。 默认按类型注入,如果有多个实现可以配合 @Qualifier 或 @Primary 使用。 在生产项目中更推荐使用构造方法注入。

Spring IOC + DI 流程图

一、先给你一张「全流程总览图」(核心)


二、什么是 IOC?用一句话讲清楚

❌ 没有 IOC(传统方式)

你自己:
  • 创建对象
  • 管理对象
  • 控制生命周期

✅ 有 IOC(Spring)

👉 对象的控制权交给 Spring
📦 IOC(Inversion of Control)= 控制反转

三、IOC 容器你可以这样理解(很重要)

👉 Spring 提前帮你把对象都准备好

四、DI 是什么时候发生的?(关键点)

DI = Dependency Injection(依赖注入)

发生在:
Bean 创建之后,Bean 初始化之前
也就是这一步 👇

五、结合真实代码 + 流程图(最好理解)

示例代码

Spring 内部实际流程(白话版)


六、IOC + DI 分工对照表(必记)

概念
负责什么
IOC
创建 & 管理对象
DI
给对象注入依赖
一句话总结:
IOC 负责“对象从哪来” DI 负责“对象怎么连起来”

七、如果用一句话画「流程图」


八、初级工程师最容易混淆的点(重点提醒)

❌ 误区 1:@Autowired 会创建对象

❌ 错 ✅ 创建对象的是 IOC

❌ 误区 2:new 出来的对象也能注入

❌ 错 ✅ 只有 IOC 容器里的对象才能 DI

九、终极记忆口诀(一定要背)

IOC 管对象DI 管关系@Component 进容器@Autowired 建联系

附:IOC + DI + AOP Combined Flowchart

notion image