好的!下面是【SpringBoot】系列教程中关于“从零开始全面解析Spring IoC和DI(二)”的详细内容讲解,帮助你深入理解Spring核心容器的依赖注入(DI)及IoC原理和实战应用。


【SpringBoot】从零开始全面解析Spring IoC & DI(二)


目录

  1. IoC与DI回顾
  2. Spring IoC容器详解
  3. Bean的生命周期管理
  4. 依赖注入方式详解
  5. @Autowired注解使用详解
  6. @Qualifier与@Primary的应用
  7. 构造器注入 vs Setter注入 vs 字段注入
  8. Spring配置文件与注解配置的对比
  9. Spring Boot中IoC和DI的实际应用案例
  10. 小结

1. IoC与DI回顾

  • IoC(控制反转):将对象的控制权从程序内部转移到容器,容器负责对象的创建、管理和销毁。
  • DI(依赖注入):IoC的实现方式之一,通过容器自动将所需依赖对象注入到目标对象中,降低耦合度。

2. Spring IoC容器详解

  • Spring IoC容器是核心组件,负责管理Bean的创建和生命周期。
  • 常用容器类型:
    • BeanFactory:最原始的容器,延迟加载Bean。
    • ApplicationContext:功能更强,支持国际化事件发布和自动装配,常用类型包括ClassPathXmlApplicationContextAnnotationConfigApplicationContext等。

3. Bean的生命周期管理

  • Bean生命周期阶段:
    • 实例化
    • 属性赋值(依赖注入)
    • 初始化(@PostConstructafterPropertiesSet()
    • 使用
    • 销毁(@PreDestroyDisposableBean

4. 依赖注入方式详解

  • 构造器注入(Constructor Injection)
    • 通过构造函数注入依赖,保证依赖不可变。
  • Setter方法注入(Setter Injection)
    • 通过Setter方法注入,适用于可选依赖。
  • 字段注入(Field Injection)
    • 直接注入到字段,简洁但不利于测试和维护。

5. @Autowired注解使用详解

  • 作用:自动按类型注入依赖Bean。
  • 可加在构造器、Setter方法或字段上。
  • 配合required属性,控制是否必须注入。
  • 结合@NullableOptional处理可选依赖。

示例:

@Autowired
private UserService userService;

6. @Qualifier与@Primary的应用

  • 当容器中有多个相同类型Bean时,通过@Qualifier("beanName")指定注入哪一个。
  • 使用@Primary标记一个首选Bean,减少显式指定的需求。

示例:

@Autowired
@Qualifier("specialUserService")
private UserService userService;

7. 构造器注入 vs Setter注入 vs 字段注入

注入方式优点缺点适用场景
构造器注入保证依赖不可变,便于测试代码量稍多必须依赖,推荐使用
Setter注入灵活,可选依赖可能导致部分依赖未注入可选或循环依赖处理
字段注入简洁,代码少不利于测试,违反封装原则简单场景,快速开发

8. Spring配置文件与注解配置的对比

配置方式特点优缺点
XML配置传统方式,显式配置Bean及依赖关系灵活但冗长,维护成本高
注解配置现代方式,使用注解声明依赖关系简洁,类型安全,维护方便

9. Spring Boot中IoC和DI的实际应用案例

  • 示例代码:
@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // 业务逻辑方法
}
  • 通过Spring Boot自动扫描,实现自动装配。
  • 结合@Configuration和@Bean实现复杂依赖注入。

10. 小结

  • Spring IoC容器负责管理对象生命周期,实现依赖注入降低耦合。
  • 多种注入方式满足不同场景需求,@Autowired是核心注解。
  • @Qualifier@Primary解决同类型Bean注入冲突。
  • 注解配置使Spring开发更加便捷高效。