SpringIOC中Bean生命周期
Bean分为系统Bean和自定义Bean
Bean的三个阶段:生成,使用,销毁
生产
1.加载Bean定义
通过 loadBeanDefinitions 扫描所有xml配置、注解找到的所有Bean,加入到beanDefinitionMap中
2.创建Bean对象
通过 createBean 遍历 beanDefinitionMap 创建bean
2.1.构建对象
- 容器通过 createBeanInstance 进行对象构造
- 获取构造方法:@Autowired
- 准备参数 根据类查找>参数名查找
- 构造对象
- 无参对象直接实例化
2.2.填充属性
通过populateBean方法为Bean内部所需的属性进行赋值
- 通常是 @Autowired 注解的变量
2.3.初始化Bean对象
通过initializeBean对填充后的实例进行初始化
填充初始化容器相关信息
通过 invokeAwareMethods 方法:为实现aware接口【信息感知接口】的Bean 设置注入beanName、beanFactory等容器信息
初始化构造方法
通过 invokeInitMethods 方法进行初始化:
如果Bean实现InitializingBean接口进行处理【未实现则不进行】
- afterPropertiesSet方法【bean填充属性后执行】
- initMethod 方法
Bean的后置处理
在invokeInitMethods 的前后进行
- applyBeanPostProcessorsBeforeInitialization
- invokeInitMethods
- applyBeanPostProcessorsAfterInitialization
在后置处理中处理了包括:AOP【AnnotationAwareAspectJAutoProxyCreator】
负责 构造后@PostConstruct 和 销毁前@PreDestroy 的 InitDestoryAnnotationBeanPostProcessor 等
注册销毁
通过reigsterDisposableBean处理实现了DisposableBean接口的Bean的注册
3.添加到单例池
通过 addSingleton 方法,将Bean 加入到单例池 singleObjects
4.销毁
4.1.销毁前
调用 bean中@PreDestory 注解的方法
通过 postProcessBeforeDestruction 方法调用destoryBean逐一销毁Bean
4.2.销毁
调用 destoryBeans
4.3.执行客户自定义销毁
调用 invokeCustomDestoryMethod
🌱 Spring Bean生命周期通俗详解
🍃 一句话总结
Bean的生命周期就像一个人的一生:出生 → 成长 → 死亡,Spring 全程监护管理
🧩 分阶段详解(结合专业名词)
1️⃣ 出生阶段(创建与初始化)
(1) 受孕(Bean定义加载)
- Spring读取
@Component
、XML配置等,生成BeanDefinition
(相当于宝宝的DNA蓝图) - 📌 关键接口:
BeanDefinitionRegistry
(2) 分娩(实例化)
- 通过反射调用构造函数
new Instance()
- 📌 关键方法:
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
(3) 体检(属性注入)
- 给对象打"营养针"(依赖注入)
@Autowired → 自动注入
<property name="xxx"> → XML方式
- 📌 关键接口:
BeanPostProcessor.postProcessProperties()
(4) 办出生证(初始化)
- 调用
@PostConstruct
方法(宝宝第一次啼哭) - 执行
InitializingBean.afterPropertiesSet()
(办户口) - 调用自定义
init-method
(取名字) - 📌 执行顺序:
@PostConstruct
→afterPropertiesSet()
→init-method
2️⃣ 成年阶段(使用期)
- Bean进入Spring容器的单例池(
singletonObjects
) - 随时等待被
@Autowired
注入使用 - 📌 关键缓存:
DefaultSingletonBeanRegistry.singletonObjects
3️⃣ 退休阶段(销毁)
(1) 退休通知
- 容器关闭时发出销毁信号
- 📌 触发方式:
ctx.close()
或@PreDestroy
(2) 办理退休手续
- 调用
@PreDestroy
方法(写回忆录) - 执行
DisposableBean.destroy()
(交还工牌) - 调用自定义
destroy-method
(办退休宴) - 📌 执行顺序:
@PreDestroy
→destroy()
→destroy-method
🧪 代码验证示例
public class Person implements InitializingBean, DisposableBean {public Person() {System.out.println("1. 调用构造函数【分娩】");}@Autowiredpublic void setJob(Job job) {System.out.println("2. 依赖注入【打营养针】");}@PostConstructpublic void postConstruct() {System.out.println("3. @PostConstruct【第一次啼哭】");}@Overridepublic void afterPropertiesSet() {System.out.println("4. afterPropertiesSet【办户口】");}public void customInit() {System.out.println("5. init-method【取名字】");}@PreDestroypublic void preDestroy() {System.out.println("6. @PreDestroy【写回忆录】");}@Overridepublic void destroy() {System.out.println("7. destroy()【交工牌】");}public void customDestroy() {System.out.println("8. destroy-method【退休宴】");}
}
🔍 生命周期扩展点
扩展点 | 执行时机 | 典型应用 |
---|---|---|
BeanPostProcessor | 初始化前后 | AOP代理、监控 |
InstantiationAwareBeanPostProcessor | 实例化前后 | 属性修改 |
SmartInitializingSingleton | 所有单例初始化完成后 | 缓存预热 |
💡 面试金句
- "Bean生命周期核心是实例化→属性填充→初始化→销毁四大阶段"
- "Spring通过BeanPostProcessor机制实现生命周期扩展"
- "初始化顺序:
@PostConstruct
→InitializingBean
→init-method
"
理解Bean生命周期,才能真正掌握Spring的运作机制! 🎯