Spring生命周期(完整版)
Spring生命周期(完整)
1. Bean的定义加载和预处理阶段(在容器初始化时进行)
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方法生成额外的BeanDefinitionSpring Boot 的 application.yml/.properties不直接生成 BeanDefinition!它们提供属性值,用于填充已有 BeanDefinition的属性(通过@Value或@ConfigurationProperties),本身不是 Bean 定义源将处理好的BeanDefinition对象注册到BeanDefinitionRegistry(容器的注册表),这里只是存储Bean的定义,不是Bean的实例。
BeanFactoryPostProcessor对BeanDefinition对象进行增强,其核心的方法是PostProcessBeanFactory(ConfigurableListableBeanFactory beanFactory),用于增加Bean定义或者修改Bean属性值。,你可以通过beanFactory对注册表中的BeanDefinition进行修改或者新增。
2. Bean实例化阶段
目标:根据 BeanDefinition 创建出 Bean 的原始 Java 对象(尚未注入属性,也未初始化)
InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(Class<?> beanClass,String beanName) 在实例化Bean之前执行,返回Object,可以替代原始实例。
Spring 啥都不干,直接用你的(如果返回非null对象)
Bean对象实例化(这里默认使用构造方法实例化)
InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation(Class<?> beanClass,String beanName) 在实例化Bean之后执行,返回false表示跳过后续属性赋值
Spring 跳过自动注入(属性赋值),但继续后续步骤(如何返回false)
3. Bean属性赋值阶段
InstantiationAwareBeanPostProcessor#postProcessPropertyValues(5.1-)/postProcessProperties在Bean属性赋值前可以对修改要注入的属性值。
在 Spring 执行属性注入前,允许你修改即将注入的属性值集合(
PropertyValues)。依赖注入(属性赋值),这里有3种注入(构造函数注入,Setter注入,字段注入)。
接口回调,依次调用BeanNameAware,BeanFactoryAware,ApplicationContextAware,使Bean能感知自己在容器中的信息。
在属性注入完成后、初始化方法调用前,Spring 会检查 Bean 是否实现了某些
Aware接口,并自动调用对应方法:Aware 接口 回调方法 作用 BeanNameAwaresetBeanName(String name)告诉 Bean 自己在容器中的名字(如 “userService”) BeanFactoryAwaresetBeanFactory(BeanFactory beanFactory)注入 BeanFactory,可手动获取其他 BeanApplicationContextAwaresetApplicationContext(ApplicationContext ctx)注入 ApplicationContext,功能比BeanFactory更强(支持事件、资源加载等)
4. Bean初始化阶段
初始化前增强,调用BeanPostProcess的postProcessBeforeInitialization方法,接受当前Bean实例,可对其进行修改,增强(设置属性等),返回增强后的Bean实例(一般仅仅修改内部)
- 时机:在调用任何用户定义的初始化方法(如
@PostConstruct、InitializingBean.afterPropertiesSet()、init-method)之前。 - 作用:
- 可以对 Bean 实例进行预处理(如校验、设置额外属性、包装等)。
- 必须返回一个对象:通常返回原
bean(可能已修改内部状态),也可以返回一个全新的对象(但极少见)。
- 时机:在调用任何用户定义的初始化方法(如
Bean初始化
Spring 按以下优先级顺序调用初始化方法(只要定义了就会执行):
初始化方式 说明 @PostConstruct注解的方法JSR-250 标准,推荐使用 InitializingBean.afterPropertiesSet()Spring 特有接口 init-method(XML 或@Bean(initMethod = "..."))配置式初始化 初始化前增强,调用BeanPostProcess的postProcessAfterInitialization方法,其核心就是扩展。接受的使初始化完成的Bean实例,对其进行增强。
- 时机:在所有用户初始化方法执行完毕之后。
- 作用:
- 对已完成初始化的 Bean 进行最终增强。
- 最核心用途:创建 AOP 代理对象!
- 比如事务(
@Transactional)、缓存(@Cacheable)、安全(@PreAuthorize)等,都是在这里生成代理。
- 比如事务(
5. Bean使用阶段
- Bean就绪可用(可以使用注解或者ApplicationContext.getBean直接获取)
- 使用SmartInitializingSingleton进行协同初始化
- 触发时机:
在 所有单例 Bean 都创建并初始化完成之后,Spring 会一次性调用所有实现了该接口的 Bean 的afterSingletonsInstantiated()方法。 - 目的:
让某些组件知道 “整个容器的单例 Bean 已经全部准备好了”,可以执行一些汇总性、协调性操作。
- 触发时机:
6. Bean销毁阶段
使用DestructionAwareBeanPostProcessor进行销毁前的最终处理
- 这是销毁前的最后一个扩展点。
- 作用:
- 允许框架或自定义逻辑在 Bean 真正销毁前做清理准备。
- 最典型用途:移除 AOP 代理、取消注册监听器、清除缓存引用等。
Bean销毁





