Spring 核心思想解析:IoC 与 DI 一文讲透(从入门到工程理解)

一、前言

在学习 Spring Boot 的过程中,我们几乎每天都会写:

java 复制代码
@Autowired
private UserService userService;

但很多人会有疑问:

复制代码
为什么不用 new?
为什么接口也能注入?
IoC 和 DI 到底是什么关系?

👉 本文将从直觉 → 原理 → 工程实践,彻底讲清楚:

复制代码
IoC(控制反转)与 DI(依赖注入)

二、没有 IoC 的世界(传统写法)

先看最原始的代码:

java 复制代码
UserService userService = new UserServiceImpl();
userService.register(dto);

你在做什么?

复制代码
✔ 自己决定用哪个实现类
✔ 自己创建对象(new)
✔ 自己管理依赖关系

👉 本质:

复制代码
程序员掌控一切(控制权在你)

问题在哪?

复制代码
❌ 强耦合(绑定具体实现)
❌ 不易扩展(换实现要改代码)
❌ 不易测试(难 mock)
❌ 代码维护成本高

三、引入 IoC(控制反转)

在 Spring 中,我们写:

java 复制代码
@Autowired
private UserService userService;

发生了什么?

复制代码
✔ 没有 new
✔ 没有指定实现类
✔ 直接可以用

👉 实际上:

复制代码
Spring 创建了对象
Spring 管理对象
Spring 把对象交给你

控制权发生了变化


❌ 之前
复制代码
你 → 控制对象创建

✅ 现在
复制代码
Spring → 控制对象创建
你 → 被动使用

👉 这就是:

控制反转(IoC:Inversion of Control)


四、IoC 到底是什么?


定义

IoC 是一种设计思想:将对象的创建与管理交给容器,而不是由程序员手动控制


核心思想

复制代码
不自己 new,对象由框架管理

本质

复制代码
控制权反转(你 → Spring)

五、DI(依赖注入)是什么?


定义

DI(Dependency Injection)是将对象依赖注入到使用方的一种机制


示例

java 复制代码
@Autowired
private UserService userService;

👉 意味着:

Spring 把 UserServiceImpl 注入进来


通俗理解

复制代码
你不创建对象,Spring 主动"塞给你"

六、IoC 与 DI 的关系(重点)

标准表述

IoC 是一种思想
DI 是实现 IoC 的一种方式


更严谨说法

复制代码
DI 是 IoC 最常见的实现方式

关系图

复制代码
IoC(思想)
 ├── DI(依赖注入)✔ 主流
 └── DL(依赖查找)❌ 较少使用

七、DI 的两种方式(补充理解)

1️⃣ 依赖注入(DI)

java 复制代码
@Autowired
UserService userService;

👉 Spring 自动给你对象 ✔


2️⃣ 依赖查找(DL)

java 复制代码
UserService userService = context.getBean(UserService.class);

👉 自己去容器里拿 ❌(不推荐)

八、为什么要用 IoC / DI?

✔ 1️⃣ 解耦

复制代码
只依赖接口,不依赖实现

✔ 2️⃣ 可扩展

复制代码
随时替换实现类

✔ 3️⃣ 可测试

复制代码
方便 Mock(测试替换)

✔ 4️⃣ 可维护

复制代码
代码结构清晰

九、面向接口编程(关键补充)

为什么注入接口?

java 复制代码
@Autowired
private UserService userService;

👉 而不是:

java 复制代码
@Autowired
private UserServiceImpl userService;

原因:

复制代码
✔ 解耦
✔ 灵活替换实现
✔ 企业级标准

👉 Spring 实际注入的是:

复制代码
UserServiceImpl 对象 ✔

十、工程级理解

你写:

java 复制代码
@Autowired
UserService userService;

👉 实际表达的是:

复制代码
我只依赖"能力"(接口)
具体实现由 Spring 决定

👉 这背后是:

复制代码
IoC + DI + 面向接口编程

十一、一句话总结

IoC 是控制权反转的思想,DI 是将依赖对象注入到使用方的一种实现方式,两者共同实现了低耦合的系统设计

十二、结语

很多人停留在:

复制代码
会用 @Autowired

但真正的工程能力在于:

理解 IoC 背后的设计思想

从:手动控制对象 - > 到:交给框架管理对象

这是一次非常重要的认知跃迁。

相关推荐
2601_957786771 小时前
企业矩阵运营的“三段论“:管号、产内容、获线索——全链路系统的价值拆解
java·前端·矩阵·多平台管理
Run_Teenage1 小时前
算法模板:输入输出,并查集
java·开发语言·算法
一 乐2 小时前
公交线路查询系统|基于Java+vue公交线路查询系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·公交线路查询系统
AllData公司负责人2 小时前
亲测丝滑,体验跃迁|AllData通过集成开源项目Datart,让数据可视化一目了然
java·大数据·数据库·python·数据可视化·数据视图·datart
未若君雅裁2 小时前
RabbitMQ 高可用机制:普通集群、镜像队列与仲裁队列
java·微服务·rabbitmq·java-rabbitmq
i220818 Faiz Ul2 小时前
相亲网站|相亲网站系统|基于Java+vue相亲网站系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·相亲网站系统
asdfg12589632 小时前
str.charAt(i)和c.charValue()区分(c是Character (对象))
java
AKA__Zas2 小时前
芝士算法 (双指针篇2.0)
java·数据结构·leetcode·学习方法
ZFSS2 小时前
Pika 视频生成 API 集成教程
java·数据库·人工智能·ai·音视频
Chase_______2 小时前
【Java杂项】String 为什么不可变?从对象引用、常量池到字符串拼接讲清楚
java·开发语言