依赖注入,通俗说就是:
一个类需要用到别的对象时,不自己去创建,而是让 Spring 帮它准备好、塞进来。
1. 先用生活例子理解
你开一家奶茶店,需要这些东西:
text
奶茶师傅
茶叶
牛奶
杯子
收银机
如果你什么都自己准备,就像这样:
text
我自己买茶叶
我自己买牛奶
我自己准备杯子
我自己找收银机
这叫 自己创建依赖。
但如果有一个"后勤管家"提前帮你准备好:
text
你只要说:我需要茶叶、牛奶、杯子
后勤管家就自动送过来
这就是 依赖注入。
在 Spring Boot 里,Spring 就是这个"后勤管家"。
2. 在代码里是什么意思?
比如 ThoughtController 需要用到 ThoughtService:
java
@RestController
@RequiredArgsConstructor
public class ThoughtController {
private final ThoughtService thoughtService;
}
意思是:
text
ThoughtController 不自己 new ThoughtService
而是告诉 Spring:我需要 ThoughtService
Spring 启动时自动把 ThoughtService 塞进来
这就叫 依赖注入。
3. 什么是"依赖"?
依赖就是:
A 类运行时需要 B 类帮忙,那么 B 就是 A 的依赖。
比如:
text
Controller 需要 Service
Service 需要 Mapper
Mapper 需要数据库连接
关系大概是:
text
Controller
↓ 依赖
Service
↓ 依赖
Mapper
↓ 依赖
Database
所以在你的项目里:
java
ThoughtController
可能依赖:
text
ThoughtService
UserService
MinioService
这些都可以由 Spring 自动注入。
4. 为什么要用依赖注入?
主要是为了让代码更好维护。
不用依赖注入时,可能这样写:
java
public class ThoughtController {
private ThoughtService thoughtService = new ThoughtService();
}
这样的问题是:
text
Controller 和 ThoughtService 绑死了
以后想换实现、加代理、加事务、加日志都麻烦
使用依赖注入后:
java
private final ThoughtService thoughtService;
Spring 来负责提供对象。
好处是:
| 好处 | 通俗解释 |
|---|---|
| 解耦 | 类和类之间不要绑太死 |
| 好测试 | 测试时可以换成假的 Service |
| 好维护 | 改一个类,不容易牵连一堆地方 |
| Spring 能管理 | 事务、缓存、AOP、日志增强都更方便 |
5. 常见注入方式
最推荐的是 构造器注入:
java
@Service
@RequiredArgsConstructor
public class ThoughtService {
private final ThoughtMapper thoughtMapper;
}
意思是:
text
ThoughtService 需要 ThoughtMapper
Spring 启动时会自动传进来
以前也常见这种:
java
@Autowired
private ThoughtMapper thoughtMapper;
这个叫字段注入,现在不太推荐。
6. 为什么你会报错?
因为 Spring 注入时找不到某个东西。
比如它看到:
text
创建 ThoughtController 需要:
1. ThoughtService
2. UserService
3. String
前两个是 Spring 管理的对象,它能找到。
但 String 是普通字符串,不是 Spring 管理的业务对象。
所以它会懵:
text
你让我注入一个 String?
我仓库里没有 String 类型的 Bean 啊。
然后启动失败。
这就是你之前看到的类似错误:
text
required a bean of type 'java.lang.String' that could not be found
7. 一句话总结
依赖注入就是:一个类需要用到别的类时,不自己创建,而是让 Spring 自动把需要的对象传进来。
你可以把 Spring 理解成:
一个专门管理对象的仓库。
哪个类需要什么对象,Spring 就从仓库里拿出来给它。