Spring IOC容器的生命周期

156 阅读3分钟

Spring IOC容器的生命周期涵盖启动(配置加载、Bean注册)、Bean实例化(依赖注入、初始化回调)、运行期管理及关闭(销毁Bean、资源释放),通过BeanPostProcessor等扩展点实现高度可定制化。


1. 容器启动阶段

核心方法ApplicationContext.refresh()

  • 触发方式:通过创建ApplicationContext(如ClassPathXmlApplicationContextAnnotationConfigApplicationContext)并调用refresh()方法启动容器。

  • 关键步骤

    1. 资源定位与加载:解析配置文件(XML或注解),定位资源(如@Configuration类、XML文件)。
    2. BeanDefinition解析与注册:将配置转换为BeanDefinition对象,并注册到BeanFactoryBeanDefinitionRegistry中。
    3. BeanFactory预处理:调用BeanFactoryPostProcessor(如PropertySourcesPlaceholderConfigurer)修改Bean定义(如占位符替换)。

2. Bean实例化与初始化阶段

核心流程:按需创建Bean实例(单例默认立即加载,原型作用域延迟加载)。

  • 步骤详解

    1. 实例化Bean:通过构造函数或工厂方法创建Bean对象。

    2. 属性注入:填充依赖(通过Setter、构造器或字段注入),处理@Autowired@Resource等。

    3. Aware接口回调

      • BeanNameAware.setBeanName()
      • BeanFactoryAware.setBeanFactory()
      • ApplicationContextAware.setApplicationContext()
    4. BeanPostProcessor前置处理postProcessBeforeInitialization()(如@PostConstruct处理)。

    5. 初始化方法

      • 实现InitializingBeanafterPropertiesSet()
      • 自定义init-method(通过@Bean(initMethod="...")或XML配置)。
    6. BeanPostProcessor后置处理postProcessAfterInitialization()(如AOP代理的生成)。


3. 容器就绪阶段

  • 事件发布:容器刷新完成后,发布ContextRefreshedEvent,通知监听者容器已就绪。
  • 运行状态:此时所有单例Bean已初始化完成,可通过ApplicationContext按需获取Bean。

4. 容器运行阶段

  • Bean的使用:应用程序通过getBean()获取Bean实例,处理业务逻辑。

  • 作用域管理

    • 单例(Singleton) :容器内唯一实例,生命周期与容器一致。
    • 原型(Prototype) :每次请求创建新实例,容器不管理其销毁。
    • Web作用域(如Request、Session):在对应作用域内有效,由子容器管理。

5. 容器关闭阶段

核心方法ApplicationContext.close()

  • 触发方式:显式调用close()或注册JVM关闭钩子(registerShutdownHook())。

  • 销毁流程

    1. 发布关闭事件ContextClosedEvent通知监听者。

    2. 销毁单例Bean

      • 实现DisposableBeandestroy()方法。
      • 调用自定义destroy-method(通过@Bean(destroyMethod="...")或XML配置)。
    3. 资源释放:关闭底层资源(如数据库连接池、线程池)。


关键扩展点与接口

  • BeanFactoryPostProcessor:修改Bean定义(如属性占位符替换)。
  • BeanPostProcessor:干预Bean初始化过程(如AOP、事务管理)。
  • Aware接口:让Bean感知容器基础设施(如Bean名称、ApplicationContext)。
  • 生命周期接口InitializingBeanDisposableBean
  • 事件监听:实现ApplicationListener响应容器事件(如刷新、关闭)。

流程图解

容器启动 → 加载配置 → 注册BeanDefinition → BeanFactory后处理 → 注册BeanPostProcessor → 实例化Bean → 
属性注入 → Aware回调 → BeanPostProcessor前置处理 → 初始化方法 → BeanPostProcessor后置处理 → 
容器就绪 → 运行期使用Bean → 容器关闭 → 销毁Bean → 资源释放

总结

Spring IOC容器的生命周期通过精细的阶段划分和扩展点设计,实现了高度的灵活性和可定制性。理解每个阶段的关键操作及扩展接口(如BeanPostProcessorAware),能帮助开发者在合适的时机介入容器管理,实现诸如依赖注入、AOP、资源管理等高级功能。