当前位置: 首页 > news >正文

SpringBean 创建过程详解

程序员面试资料大全|各种技术书籍等资料-1000G

Spring Bean 的完整生命周期

1. Bean 元数据加载阶段

  • 配置解析:Spring 容器解析 XML、Java Config 或注解配置
  • BeanDefinition 注册:将 Bean 定义信息注册到 BeanDefinitionRegistry
  • 依赖关系分析:解析 Bean 之间的依赖关系

2. 实例化阶段

// 伪代码展示实例化过程
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {// 1. 通过工厂方法实例化if (mbd.getFactoryMethodName() != null) {return instantiateUsingFactoryMethod(beanName, mbd, args);}// 2. 通过构造函数实例化(解决构造器参数依赖)Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR) {return autowireConstructor(beanName, mbd, ctors, args);}// 3. 默认无参构造器实例化return instantiateBean(beanName, mbd);
}

3. 属性填充阶段(依赖注入)

  • 字段注入:通过反射直接设置字段值
  • Setter 注入:调用 setter 方法
  • 方法注入:处理 @Autowired 注解的方法

4. 初始化阶段(关键扩展点)

  1. Aware 接口回调

    • BeanNameAware:设置 Bean 名称
    • BeanFactoryAware:设置 BeanFactory 引用
    • ApplicationContextAware:设置 ApplicationContext 引用
  2. BeanPostProcessor 前置处理

    // 所有 BeanPostProcessor 的 postProcessBeforeInitialization 方法
    for (BeanPostProcessor bp : getBeanPostProcessors()) {Object current = bp.postProcessBeforeInitialization(result, beanName);if (current == null) return result;result = current;
    }
    
  3. 初始化方法执行

    • InitializingBean 接口的 afterPropertiesSet() 方法
    • 自定义 init-method(XML 配置或 @PostConstruct 注解)
  4. BeanPostProcessor 后置处理

    // 所有 BeanPostProcessor 的 postProcessAfterInitialization 方法
    for (BeanPostProcessor bp : getBeanPostProcessors()) {Object current = bp.postProcessAfterInitialization(result, beanName);if (current == null) return result;result = current;
    }
    

5. 使用阶段

  • Bean 进入可用状态
  • 被其他 Bean 依赖或通过上下文获取

6. 销毁阶段

  1. DisposableBean 接口的 destroy() 方法
  2. 自定义 destroy-method(XML 配置或 @PreDestroy 注解)

程序员面试资料大全|各种技术书籍等资料-1000G
在这里插入图片描述

相关文章:

  • 【ELK(Elasticsearch+Logstash+Kibana) 从零搭建实战记录:日志采集与可视化】
  • 预训练 vs. 微调:大模型落地的核心两步,究竟有何不同?
  • 【Linux手册】进程地址空间:从虚拟到物理的内存寻址之旅
  • 通义大模型在文档自动化处理中的高效部署指南(OCR集成与批量处理优化)
  • go excel解析库xuri/excelize中的SAX
  • 【PyTorch项目实战】CycleGAN:无需成对训练样本,支持跨领域图像风格迁移
  • 开关电源:BUCK和BOOST
  • NotePad++ 怎么没有找到插件管理?
  • C++ 友元:打破封装边界的“特殊权限”
  • LangChain赋能RAG:从构建到评估优化的一体化实战指南
  • 跨平台多路RTSP/RTMP转RTMP推送模块深度解析
  • Python函数实战:从基础到高级应用
  • ABP VNext + gRPC 双向流:实时数据推送与订阅场景实现
  • 量化-因子处理
  • 原创模板--微信小程序 实现的背单词程序
  • GESP C++ 各等级详细知识点汇总
  • 从单口相声到群口辩论:MultiTalk开源:多角色对话生成SOTA模型,语音-视觉对齐精度达98.7%!
  • Linux 下的 socket
  • [project-based-learning] 开源贡献指南 | 自动化链接验证 | Issue模板规范
  • 【机器学习】数学基础——张量(进阶篇)
  • 西安建设工程中心交易网站/网络营销整合推广
  • 企业手机网站/网站seo谷歌
  • 建站有哪些公司/最新黑帽seo教程
  • 口碑好网站建设定制/百度24小时客服电话136
  • 杨浦做网站/百度网盘官网登陆入口
  • 网站备案密码忘/微商引流推广