在 Spring 框架中,Bean 的生命周期是一个非常精细的过程,涉及多个阶段和扩展点。以下是详细的生命周期阶段划分,包含容器内部处理细节和扩展机制:
1. 容器启动阶段(准备工作)
在 Bean 实例化之前,Spring 容器会先完成自身的初始化:
- 加载配置元数据(XML、注解、JavaConfig 等)
- 解析配置,将 Bean 定义(
BeanDefinition)注册到BeanDefinitionRegistry - 对 Bean 定义进行验证和合并(处理父子 Bean 定义继承关系)
2. 实例化前阶段(Before Instantiation)
BeanPostProcessor.postProcessBeforeInstantiation()
容器在实例化 Bean 之前,会先调用所有BeanPostProcessor的此方法。
✅ 作用:可以返回一个代理对象替代原始 Bean,从而跳过后续的实例化步骤(AOP 动态代理常在此阶段介入)。
3. 实例化(Instantiation)
- 容器根据
BeanDefinition的信息,通过反射创建 Bean 的实例:- 若指定了构造函数参数,会选择匹配的构造函数(可能涉及
ConstructorResolver解析构造函数依赖) - 实例化仅创建对象本身,属性尚未赋值,也未执行任何初始化逻辑
- 若指定了构造函数参数,会选择匹配的构造函数(可能涉及
- 此时的 Bean 是 "原始对象",仅完成了内存分配
4. 实例化后阶段(After Instantiation)
BeanPostProcessor.postProcessAfterInstantiation()
实例化完成后立即调用,返回boolean值:- 返回
false:跳过后续的属性赋值阶段 - 返回
true:继续执行属性注入
- 返回
5. 属性赋值(Population / Dependency Injection)
- 容器根据 Bean 定义中的依赖信息,为 Bean 的属性赋值:
- 处理
@Autowired、@Resource等注解,或 XML 中的<property>配置 - 通过
setter方法注入,或直接字段注入(需开启field injection) - 处理集合类型(
List、Map等)、数组、嵌套 Bean 等复杂依赖
- 处理
BeanPostProcessor.postProcessPropertyValues()
在此阶段可以修改属性值,或对属性进行验证(如 JSR-303 数据校验)
6. Aware 接口回调(设置容器上下文信息)
若 Bean 实现了以下Aware接口,容器会依次调用其方法,注入容器相关信息:
BeanNameAware.setBeanName(String beanName):注入当前 Bean 在容器中的 ID / 名称BeanClassLoaderAware.setBeanClassLoader(ClassLoader classLoader):注入类加载器BeanFactoryAware.setBeanFactory(BeanFactory beanFactory):注入当前 BeanFactoryEnvironmentAware.setEnvironment(Environment environment):注入环境配置EmbeddedValueResolverAware.setEmbeddedValueResolver(StringValueResolver resolver):注入字符串解析器(处理${}占位符)ApplicationContextAware.setApplicationContext(ApplicationContext applicationContext):注入 ApplicationContext(仅在 Web 环境或 ApplicationContext 容器中生效)
7. 初始化前阶段(Before Initialization)
BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName)
所有Aware接口回调完成后,初始化方法执行前调用。
✅ 作用:对 Bean 进行预处理,如 AOP 的增强逻辑织入(生成代理对象)。
典型应用:Spring 的AbstractAutoProxyCreator在此阶段创建代理。
8. 初始化阶段(Initialization)
执行自定义初始化逻辑,按以下优先级顺序执行:
-
@PostConstruct注解方法
JSR-250 规范注解,在依赖注入完成后自动调用(由CommonAnnotationBeanPostProcessor处理)。 -
InitializingBean.afterPropertiesSet()
实现 Spring 提供的接口,在属性赋值完成后执行。 -
自定义初始化方法
- XML 配置:
<bean init-method="init"/> - 注解:
@Bean(initMethod = "init") - JavaConfig:
@Bean(initMethod = "init")
- XML 配置:
✅ 初始化逻辑通常包括:资源加载(数据库连接、文件读取)、缓存初始化等。
9. 初始化后阶段(After Initialization)
BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)
初始化完成后调用,可对 Bean 进行最终修饰。
✅ 作用:若此时返回代理对象,容器将使用代理对象替代原始 Bean(如事务管理的代理)。
10. 使用阶段(In Use)
- Bean 已完全就绪,存入容器的缓存池(
singletonObjects)中 - 应用程序可通过
getBean()获取 Bean 并使用 - 对于单例 Bean,此阶段会持续到容器关闭;对于原型 Bean,使用后由 JVM 垃圾回收器管理
11. 销毁前阶段(Before Destruction)
当容器关闭时(如ApplicationContext.close()),单例 Bean 会触发销毁流程:
-
@PreDestroy注解方法
JSR-250 规范注解,在 Bean 销毁前调用。 -
DisposableBean.destroy()
实现 Spring 提供的接口,执行销毁逻辑。 -
自定义销毁方法
- XML 配置:
<bean destroy-method="destroy"/> - 注解:
@Bean(destroyMethod = "destroy") - JavaConfig:
@Bean(destroyMethod = "destroy")
- XML 配置:
✅ 销毁逻辑通常包括:释放资源(关闭数据库连接、网络连接)、清理临时文件等。
12. 销毁后阶段(After Destruction)
- Bean 从容器缓存中移除,彻底销毁
- 若 Bean 实现了
Phased接口,可指定销毁顺序(getPhase()返回值越大,销毁越晚)
特殊说明
- 单例 Bean:全程由 Spring 容器管理,生命周期与容器一致
- 原型 Bean:容器仅负责实例化、属性赋值和初始化,之后不再管理(销毁由 JVM 负责)
- Web 环境:还会涉及
ServletContextAware等 Web 相关Aware接口
通过上述生命周期,Spring 提供了强大的扩展能力,开发者可通过BeanPostProcessor、Aware接口、初始化 / 销毁方法等,在各个阶段插入自定义逻辑,实现对 Bean 的精细控制。
2354

被折叠的 条评论
为什么被折叠?



