SpringBoot的IOC和DI学习
前文
1.IOC的理论
IOC(Inversion of Control,控制反转)是一种设计思想,其核心是将对象的创建、管理和依赖关系的控制权从应用程序代码转移到外部容器(如 Spring 的 IOC 容器)。
传统程序设计中,对象的创建和依赖关系由开发者手动控制(例如通过new关键字创建对象,并手动组装依赖),导致代码耦合度高、灵活性差。
IOC 思想下,开发者只需定义对象的 “蓝图”(如类、接口),并通过配置或注解告知容器需要管理哪些对象;容器会负责对象的创建、初始化、生命周期管理,以及对象之间依赖关系的维护。
本质是 “反转了对象的控制权”:从 “开发者主动控制” 变为 “容器被动提供”,降低了代码间的耦合度,提高了可扩展性和可维护性。
2.DI的理论
DI(Dependency Injection,依赖注入)是 IOC 思想的具体实现方式,指容器在创建对象时,自动将该对象所依赖的其他对象(依赖)注入到其中,无需开发者手动通过new或setter方法设置依赖。
核心目的:解决对象之间的依赖关系,避免硬编码耦合。
常见注入方式:
字段注入(通过@Autowired等注解直接标注字段);
构造函数注入(通过构造方法参数传递依赖);
Setter 方法注入(通过 Setter 方法传递依赖)。
3.最后结合以下代码截屏对这两个知识点的理解
IOC 的体现:对象由容器管理
在代码中,Spring 容器通过注解(@Repository、@Service、@RestController)识别需要管理的对象,并负责其创建和生命周期:
- UserDaoimpl类上标注@Repository:告知 Spring 容器这是一个数据访问层的 Bean,容器会自动创建该类的实例并管理。
@Repository // 将当前类交给IOC容器管理
public class UserDaoimpl implements UserDao { ... }
- UserServicelmpl类上标注@Service:告知 Spring 容器这是一个业务逻辑层的 Bean,容器会自动创建其实例。
@Service // 将当前类交给IOC容器管理
public class UserServicelmpl implements UserService { ... }
- UserController类上标注@RestController:告知 Spring 容器这是一个控制器 Bean,容器会自动创建其实例。
@RestController
public class UserController { ... }
这些类无需开发者通过new手动创建(例如传统方式的UserDao userDao = new UserDaoimpl()),而是由 Spring 容器统一创建和管理,体现了 “控制反转”
DI 的体现:自动注入依赖
代码中通过@Autowired注解实现依赖注入,容器会自动将依赖的 Bean 注入到目标对象中:
- UserServicelmpl依赖UserDao:通过@Autowired注解,Spring 容器会自动从容器中查找UserDao类型的 Bean(即UserDaoimpl的实例),并注入到userDao字段中,无需手动创建UserDao实例。
@Service
public class UserServicelmpl implements UserService {@Autowired // 容器自动注入UserDao类型的Beanprivate UserDao userDao; ...
}
- UserController依赖UserService:同样通过@Autowired,容器自动将UserServicelmpl的实例注入到userService字段中,无需手动创建UserService实例。
@RestController
public class UserController {@Autowired // 容器自动注入UserService类型的Beanprivate UserService userService;...
}
通过依赖注入,UserServicelmpl无需关心UserDao的创建细节,UserController也无需关心UserService的创建细节,只需声明依赖即可,极大降低了类之间的耦合度,体现了 DI 的核心思想。
最后总结
1.IOC 是 “让容器管理对象” 的思想,通过@Repository、@Service等注解将对象交给 Spring 容器控制;
2. DI 是 IOC 的实现手段,通过@Autowired等方式自动注入依赖,解决对象间的耦合问题。
3. 代码中,容器管理UserDao、UserService、UserController的创建,并通过依赖注入自动组装它们的关系,最终实现了 “开发者只关注业务逻辑,不关心对象创建和依赖管理” 的目标。