IoC控制反转与DI依赖注入
什么是 IoC (Inversion of Control) 和 DI (Dependency Injection)?
IoC 控制反转
IoC 控制反转,指的是创建和控制注入 Spring Bean 的操作权 反转 交给框架去自动完成。
DI 依赖注入
DI 依赖注入,是 IoC 思想在 Spring 的实现,框架自动地将程序所需的依赖注入到 Bean 中。
在 Spring Boot 中的关系
IoC 是设计思想,DI 是实现方式。Spring 容器通过 IoC 容器管理 Bean,并通过 DI 完成依赖注入。
Spring Boot 中如何实现依赖注入?
依赖注入方式有:
- 注解 @Autowired 直接字段进行注入
- Setter() 方法注入
- 构造函数注入
我们通常会使用 构造函数 和 字段注入。
| 字段注入 | Setter()注入 | 构造函数注入 | |
|---|---|---|---|
| final 不可变对象 | ❌ 不可注入 | ❌ 不可注入 | ✅ 可以 |
| 通用性 | 只适用于 IoC 容器 | 只适用于 IoC 容器 | 非 IoC 也适用 |
解释@Autowired 注解的作用,以及它在 Spring Boot 中的自动装配模式有哪些?
什么是 Bean 的作用域 (Scope)?
Spring Boot 支持多种 Bean 作用域:
| 作用域 | 描述 |
|---|---|
| singleton | 单例模式(默认) |
| prototype | 原型模式,每次请求创建新实例 |
| request | 每次 HTTP 请求创建一个实例(Web) |
| session | 同一个 HTTP Session 共享实例 |
| application | ServletContext 生命周期 |
@Qualifier 和 @Primary 注解
- @Qualifier:显式指定 Bean 名称,用于解决多个同类型 Bean 的冲突
- @Primary:标记优先使用的 Bean
ApplicationContext 与 BeanFactory
| 特性 | BeanFactory | ApplicationContext |
|---|---|---|
| 类型 | 基础接口 | BeanFactory 的子接口,更高级 |
| 功能 | 基础的 IoC 容器功能 | 提供更多企业级特性(事件发布、国际化、资源加载等) |
| 初始化时机 | 懒加载(getBean 时才初始化) | 饿加载(容器启动时预加载所有单例 Bean) |
| 适用场景 | 资源受限的环境或需要延迟加载 | 大多数企业应用(推荐使用) |
配置文件依赖注入
可以在 application.properties 或 application.yml 中配置属性,然后通过:
- @Value("${property.name}") 注入单个属性
- @ConfigurationProperties 批量注入属性
依赖反转原则 (DIP)
依赖反转原则(DIP)是 SOLID 原则之一,主张:
- 高层模块不应依赖低层模块,两者都应依赖抽象
- 抽象不应依赖细节,细节应依赖抽象
DI 是 DIP 在 Spring 中的具体实现。