IOC

IOC

设计思想

将程序的控制权从开发者手中转移到框架或容器中。传统开发中,开发者需要主动创建和管理对象(如通过 new​ 关键字),而 IoC 通过容器统一管理对象的生命周期和依赖关系,开发者只需声明需要什么,由容器负责如何创建和注入。

IOC 容器

Spring 的 IoC 容器就是 IoC 思想的一个方案实现。由其管理的组件称为 Bean。Spring 提供两种方式创建容器:

  • BeanFactory
    最基础的容器接口,提供最基本的 IoC 功能。面向 Spring 本身,不提供给开发人员使用。
  • ApplicationContext
    ApplicationContext​ 是 BeanFactory​ 的子接口,支持事件发布、国际化、资源加载、AOP、事务管理等。
    常用实现类:
    实现类简介
    ClassPathXmlApplicationContext从类路径下的 XML 文件加载配置。
    AnnotationConfigApplicationContext基于 Java 注解和配置类加载配置。
    FileSystemXmlApplicationContext从文件系统路径加载 XML 配置。
    WebApplicationContext专为 Web 应用设计的实现(如 Spring MVC 中使用)。

Bean 的作用域

Spring 支持以下 6 种标准作用域,可通过 @Scope​ 注解配置:

作用域说明
singleton默认作用域,每个 Spring 容器中仅存在一个实例(单例)
prototype每次依赖注入或 getBean()​ 调用时创建新实例
request每个 HTTP 请求创建一个实例(Web 应用)
session每个用户会话( Session )创建一个实例(Web 应用)
application整个 Web 应用生命周期内一个实例(类似 ServletContext)
websocket每个 WebSocket 会话一个实例(WebSocket 应用)

Bean 的生命周期

%% Spring Bean 生命周期流程图
flowchart TD
    A[实例化 Bean] --> B[属性注入/依赖注入]
    B --> C[调用 Aware 接口方法]
    C --> D[BeanPostProcessor.postProcessBeforeInitialization]
    D --> E[执行 @PostConstruct 方法]
    E --> F[执行 InitializingBean.afterPropertiesSet]
    F --> G[执行自定义 init 方法]
    G --> H[BeanPostProcessor.postProcessAfterInitialization]
    H --> I((Bean 就绪))
    I --> J[容器关闭]
    J --> K[执行 @PreDestroy 方法]
    K --> L[执行 DisposableBean.destroy]
    L --> M[执行自定义 destroy 方法]