Spring Bean生命周期
Bean 的生命流程简述
- Instantitaion
- populate
- Initialization
- 使用
- 结束销毁
Instantiation
什么是 Instatiation? 他和 populate 有什么区别?
Spring 的 Bean 创建是控制反转(IoC)的核心体现。容器根据 BeanDefinition 中的元数据(如类名、作用域、构造参数、工厂方法、初始化/销毁方法等),通过 Java 反射机制来实例化 Bean 对象。 这个阶段只是‘创建空壳对象’,尚未进行依赖注入。 后续 Spring 会基于同样的 BeanDefinition 完成 属性填充(即依赖注入)和初始化,最终将一个完整可用的 Bean 交还给应用。 通过这种方式,对象的创建和依赖管理不再由程序员手动控制(比如 new),而是交给了 Spring 容器,实现了控制反转。
三种创建对象的方法
- Supplier
- 工厂方法
- 构造函数
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
//检查获取 BeanDefinition
Class<?> beanClass = resolveBeanClass(mbd, beanName);
//首先检查是否提供了 Supplier,如果有就直接返回创建对象
Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
if (instanceSupplier != null) {
return obtainFromSupplier(instanceSupplier, beanName);
}
//检查是否有工厂方法
if (mbd.getFactoryMethodName() != null) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}
//执行后置处理器, 获取候选构造方法
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
return instantiateBean(beanName, mbd);
}
populate
populate 在做什么?
popluate 流程主要是将属性注入到上一步创建好的“空壳对象”,核心是对对象中有 [[@Autowired]] 和 @Resource 的字段 Setter 函数等注入属性,完成这一步后会进行 Initialization 进行 AOP 代理、回调 Aware 接口、回调初始化方法。
属性填充的核心流程
- 读取 BeanDefinition
Spring 查看这个 Bean 的PropertyValues(属性值元数据) - 解析依赖来源
- 如果依赖来源于其他 Bean,那么递归先去创建该 Bean(如果成环这里就可能诞生 [[依赖循环]]依赖循环的问题)
- 如果来源于配置文件,则从
Environment中读取
- 通过反射赋值
- [[Spring/@AutoWired.md|@AutoWired ]]注入(构造器注入已经在 Instantiation 阶段完成)
- @Resource 注入
Initalization
Aware BeanPostProcessor invokeInitMethods() BeanPostFactory.postProcessAfterInitialization()
| 步骤 | 名称 | 作用 | 代码体现 | 具体效果 |
|---|---|---|---|---|
| 4 | BeanPostProcessor 前置处理 |
在初始化方法执行前,允许你对 Bean 做预处理 | postProcessBeforeInitialization |
打印日志,告诉开发者“Bean 即将初始化”,可用于权限检查、日志埋点等。 |
| 5 | 是否实现 InitializingBean |
Spring 提供的标准初始化回调接口 | afterPropertiesSet() |
在这里做数据校验(如用户名不能为空),确保 Bean 状态合法。 |
| 6 | 是否配置自定义 init-method |
用户自定义的初始化方法 | myInitMethod() |
在这里做业务初始化(如加载缓存、连接数据库),非常灵活。 |
| 7 | BeanPostProcessor 后置处理 |
在所有初始化完成后,对 Bean 进行最终处理或包装 | postProcessAfterInitialization |
关键效果:返回一个代理对象!这使得你可以无侵入地给 Bean 添加功能(如事务、日志、安全检查),这就是 AOP 的基础。 |
! [[../pics/SpringBean.png]]
Destruction
当容器关闭时会调用
- DisposableBean.destroy()
- destory-method()
与初始化阶段的
InitializingBean.afterPropertiesSet()和init_method对称
总结:Destruction 的核心要点
| 要点 | 说明 |
|---|---|
| 两个钩子 | DisposableBean.destroy() + destroy-method |
| 执行顺序 | @PreDestroy → destroy() → destroy-method |
| 触发条件 | 必须调用 context.close() |
| 为什么重要 | 防止 资源泄漏(数据库连接、线程池、文件句柄等) |
| 最佳实践 | 用 @PreDestroy 注解方法,清晰且解耦 |
Reference
title: "聊透Spring bean的生命周期一步一图带你理解Spring bean的生命周期,清楚Spring的IOC、DI、A - 掘金"
image: "https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1960950d22104a639e09de10d2bff105~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?"
description: "一步一图带你理解Spring bean的生命周期,清楚Spring的IOC、DI、AOP是怎么完成的,并教你如何借助Bean的生命周期,拓展你的应用"
url: "https://juejin.cn/post/7155884227714613285"
favicon: ""
aspectRatio: "24.867724867724867"
title: "聊透Spring依赖注入依赖自动注入;依赖注入模型;[[@AutoWired]]和@Resource依赖注入的解析、超找、注入流 - 掘金"
image: "https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9f2a1a92368a44c8bfb343fc864a7a52~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?"
description: "依赖自动注入;依赖注入模型;@AutoWired和@Resource依赖注入的解析、超找、注入流程分析;@Qualifier实现名称查找的原理分析"
url: "https://juejin.cn/post/7143419261657022472"
favicon: ""
aspectRatio: "42.28310502283105"