Spring Bean的生命周期 第二次思考

目录

[2025 年 5 月 第一次思考](#2025 年 5 月 第一次思考)

[2025 年 10 月 第二次思考](#2025 年 10 月 第二次思考)

[第一步首先是我们要加载配置源 注册成 BeanDefinition 对象](#第一步首先是我们要加载配置源 注册成 BeanDefinition 对象)

[第二步 实例化 bean](#第二步 实例化 bean)

[第三步 属性填充 主要是依赖注入](#第三步 属性填充 主要是依赖注入)

[第四步 初始化前的处理 实现 Aware 接口和执行增强](#第四步 初始化前的处理 实现 Aware 接口和执行增强)

[第五步 初始化](#第五步 初始化)

[第六步 初始化后的处理 主要是 aop](#第六步 初始化后的处理 主要是 aop)

[第七步 销毁](#第七步 销毁)


2025 年 5 月 第一次思考

Spring之Bean的初始化 Bean的生命周期 全站式解析-CSDN博客

2025 年 10 月 第二次思考

bean 的生命周期

第一步首先是我们要加载配置源 注册成 BeanDefinition 对象

配置源通常来自

  • XML 配置文件
  • 注解
  • 编程式对象声明时的配置

这些配置被解析后生成 bean 的元信息对象 即 BeanDefinition

含各种信息的方法

解析后的 BeanDefinition 放到一个 BeanDefinitionRegistry 里面

BeanDefinitionRegistry 实际上是一个 bean

放在里面的都是还未实例化的 bean

第二步 实例化 bean

Bean 的实例化 是在创建对象阶段

非懒加载的 bean 会在容器启动前提前初始化

实例化的一些信息就是从刚才的元信息 BeanDefinition 里面去获取

首先我们会选择实例化方式

默认构造期 工厂方法 FactoryBean

然后会创建原始对象 仅仅为对象分配了内存 但属性配置 依赖未注入

最后再进行 DI (依赖注入) Spring 会为 bean 填充属性

第三步 属性填充 主要是依赖注入

解析依赖注入

如 xml 里面的 <property> 标签

Autowired 注解 Resource 注解

然后注入属性值

注意会在这里使用三级循环处理循环依赖

第四步 初始化前的处理 实现 Aware 接口和执行增强

第一步

检测 bean 是否实现 Aware 接口

如果实现了则注入相关资源

如 BeanNameAware 接口 注入当前 Bean 的名称

如 BeanClassLoaderAware 接口 注入当前 Bean 的类加载器

第二步

所有注册到容器的 BeanPostProcessor (bean 后处理器) 会执行

可以将其理解成 bean 生命周期的一个拓展点 用于增强

会依次调用其 postProcessBeforeInitialization()方法

即 BeanPostProcessor.postProcessBeforeInitialization()会生效

示例代码

复制代码
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component // 注册到 Spring 容器中
public class MyBeanPostProcessor implements BeanPostProcessor {

    // 初始化前调用
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("初始化前处理 Bean:" + beanName + ",实例:" + bean);
        return bean; // 返回原 Bean
    }

}

第五步 初始化

Bean 实例化并且完成属性填充后 在 Bean 正式可用前 对其进行最后一次状态的调整

首先我们会执行 PostConstruct 注解方法

该方法会在此时被调用

执行 InitalzingBean.afterPropertiesSet()

如果实现了InitalzingBean 接口 回调用其afterPropertiesSet()方法

用于在属性设置完成后执行初始化逻辑

第六步 初始化后的处理 主要是 aop

同样的

在初始化前我们会执行 BeanPostProcessor. ...BeforeInitalzation()...

现在我们会执行

BeanPostProcessor. ...AfterInitalzation()...

最典型的场景是 AOP 代理的创建

如果 Bean 匹配到 aop 切面的切点 AOPCreator 会创建代理对象代替原来的对象

第七步 销毁

执行一系列 @PreDestory 注解方法

执行 DisposableBean.destroy() 方法

执行自定义方法

相关推荐
秋91 小时前
Go语言(Golang)开发工程师全景解析:岗位职责·语言优势与使用场景·各城市薪资·发展前景·高考志愿填报(2026版)
开发语言·golang·高考
huangdong_2 小时前
1688商品图片采集技术解析:登录态处理与SKU图自动分类
开发语言
马士兵教育2 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
chase_my_dream2 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
snow@li2 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
云烟成雨TD3 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
zfoo-framework3 小时前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java
天佑木枫3 小时前
15天Python入门系列 · 序
开发语言·python
逍遥德3 小时前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt