Spring生命周期(完整)

1. Bean的定义加载和预处理阶段(在容器初始化时进行)

  1. Spring容器将xml,yml等注册的Bean对象封装为BeanDefinition对象。

    Spring 从各种配置源(XML、注解、Java Config、Properties/YAML 等)读取 Bean 的声明信息,并封装成 BeanDefinition 对象

    🔹 配置源与对应解析器:

    配置形式 解析方式 生成 BeanDefinition 的机制
    XML 文件(如 applicationContext.xml XmlBeanDefinitionReader 每个 <bean> 标签 → 一个 BeanDefinition
    @Component / @Service 等注解类 ClassPathBeanDefinitionScanner 扫描类路径,发现带注解的类 → 注册为 BeanDefinition
    @Configuration + @Bean 方法 ConfigurationClassPostProcessor(在后续阶段处理) 先注册配置类本身,再解析其 @Bean 方法生成额外的 BeanDefinition
    Spring Boot 的 application.yml / .properties 不直接生成 BeanDefinition 它们提供属性值,用于填充已有 BeanDefinition 的属性(通过 @Value@ConfigurationProperties),本身不是 Bean 定义源
  2. 将处理好的BeanDefinition对象注册到BeanDefinitionRegistry(容器的注册表),这里只是存储Bean的定义,不是Bean的实例。

  3. BeanFactoryPostProcessor对BeanDefinition对象进行增强,其核心的方法是PostProcessBeanFactory(ConfigurableListableBeanFactory beanFactory),用于增加Bean定义或者修改Bean属性值。,你可以通过beanFactory对注册表中的BeanDefinition进行修改或者新增。

2. Bean实例化阶段

目标:根据 BeanDefinition 创建出 Bean 的原始 Java 对象(尚未注入属性,也未初始化)

  1. InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(Class<?> beanClass,String beanName) 在实例化Bean之前执行,返回Object,可以替代原始实例。

    Spring 啥都不干,直接用你的(如果返回非null对象)

  2. Bean对象实例化(这里默认使用构造方法实例化)

  3. InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation(Class<?> beanClass,String beanName) 在实例化Bean之后执行,返回false表示跳过后续属性赋值

    Spring 跳过自动注入(属性赋值),但继续后续步骤(如何返回false)

3. Bean属性赋值阶段

  1. InstantiationAwareBeanPostProcessor#postProcessPropertyValues(5.1-)/postProcessProperties在Bean属性赋值前可以对修改要注入的属性值。

    在 Spring 执行属性注入前,允许你修改即将注入的属性值集合(PropertyValues

  2. 依赖注入(属性赋值),这里有3种注入(构造函数注入,Setter注入,字段注入)。

  3. 接口回调,依次调用BeanNameAware,BeanFactoryAware,ApplicationContextAware,使Bean能感知自己在容器中的信息。

  4. 属性注入完成后、初始化方法调用前,Spring 会检查 Bean 是否实现了某些 Aware 接口,并自动调用对应方法:

    Aware 接口 回调方法 作用
    BeanNameAware setBeanName(String name) 告诉 Bean 自己在容器中的名字(如 “userService”)
    BeanFactoryAware setBeanFactory(BeanFactory beanFactory) 注入 BeanFactory,可手动获取其他 Bean
    ApplicationContextAware setApplicationContext(ApplicationContext ctx) 注入 ApplicationContext,功能比 BeanFactory 更强(支持事件、资源加载等)

4. Bean初始化阶段

  1. 初始化前增强,调用BeanPostProcess的postProcessBeforeInitialization方法,接受当前Bean实例,可对其进行修改,增强(设置属性等),返回增强后的Bean实例(一般仅仅修改内部)

    • 时机:在调用任何用户定义的初始化方法(如 @PostConstructInitializingBean.afterPropertiesSet()init-method之前
    • 作用:
      • 可以对 Bean 实例进行预处理(如校验、设置额外属性、包装等)。
      • 必须返回一个对象:通常返回原 bean(可能已修改内部状态),也可以返回一个全新的对象(但极少见)。
  2. Bean初始化

    Spring 按以下优先级顺序调用初始化方法(只要定义了就会执行):

    初始化方式 说明
    @PostConstruct 注解的方法 JSR-250 标准,推荐使用
    InitializingBean.afterPropertiesSet() Spring 特有接口
    init-method(XML 或 @Bean(initMethod = "...") 配置式初始化
  3. 初始化前增强,调用BeanPostProcess的postProcessAfterInitialization方法,其核心就是扩展。接受的使初始化完成的Bean实例,对其进行增强。

    • 时机:在所有用户初始化方法执行完毕之后
    • 作用:
      • 已完成初始化的 Bean 进行最终增强。
      • 最核心用途:创建 AOP 代理对象!
        • 比如事务(@Transactional)、缓存(@Cacheable)、安全(@PreAuthorize)等,都是在这里生成代理。

5. Bean使用阶段

  1. Bean就绪可用(可以使用注解或者ApplicationContext.getBean直接获取)
  2. 使用SmartInitializingSingleton进行协同初始化
    • 触发时机
      所有单例 Bean 都创建并初始化完成之后,Spring 会一次性调用所有实现了该接口的 Bean 的 afterSingletonsInstantiated() 方法。
    • 目的
      让某些组件知道 “整个容器的单例 Bean 已经全部准备好了”,可以执行一些汇总性、协调性操作

6. Bean销毁阶段

  1. 使用DestructionAwareBeanPostProcessor进行销毁前的最终处理

    • 这是销毁前的最后一个扩展点
    • 作用:
      • 允许框架或自定义逻辑在 Bean 真正销毁前做清理准备
      • 最典型用途:移除 AOP 代理、取消注册监听器、清除缓存引用等
  2. Bean销毁