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

容器是怎么管理 Bean 的?

文章目录

    • 1. 核心蓝图:BeanDefinition
    • 2. 核心管理流程:生命周期流水线
      • 第一阶段:准备与实例化
      • 第二阶段:装配与填充
      • 第三阶段:初始化(Initialization)
      • 第四阶段:生存与销毁
    • 3. 核心机制:三级缓存(解决循环依赖)
    • 4. BeanFactory vs ApplicationContext
      • 总结

Spring 容器对 Bean 的管理不仅仅是“创建对象”那么简单,它实际上是一套极其严密的生命周期流水线

容器通过BeanFactory(生产工厂)和BeanDefinition(施工蓝图)这两个核心组件,完成了从读取配置到销毁对象的所有工作。


1. 核心蓝图:BeanDefinition

在容器真正 new 一个对象之前,它首先要把你的配置(XML、注解、Starter)转化成一个统一的内部结构:BeanDefinition

这个蓝图记录了:

  • Bean 的全类名(Class Name)。
  • 作用域(Scope):单例还是多例。
  • 是否懒加载(Lazy-init)。
  • 依赖关系:它需要注入哪些别的 Bean。
  • 初始化和销毁方法名。

2. 核心管理流程:生命周期流水线

你可以把容器想象成一个自动化工厂,每一个 Bean 都要走完以下流程:

第一阶段:准备与实例化

  1. 加载配置:容器启动,读取扫描路径下的所有类。
  2. 注册 BeanDefinition:将信息存入BeanDefinitionMap
  3. 实例化(Instantiation):通过反射机制,调用构造函数创建一个“原生对象”。此时它只是个空的 Java 对象,还没注入数据。

第二阶段:装配与填充

  1. 属性赋值(Populate):容器根据蓝图,把对应的配置参数和依赖的其他 Bean 注入进去(比如@Value@Autowired)。
  2. Aware 回调:如果 Bean 实现了BeanNameAwareApplicationContextAware,容器会把 Bean 的名字或容器引用塞给它。

第三阶段:初始化(Initialization)

  1. BeanPostProcessor 前置处理:执行所有拦截器的postProcessBeforeInitialization方法。
  2. 初始化方法:先后执行@PostConstructInitializingBean接口方法、以及自定义的init-method
  3. BeanPostProcessor 后置处理:执行postProcessAfterInitialization注意:AOP(动态代理)通常就在这一步发生。

第四阶段:生存与销毁

  1. 就绪:Bean 进入单例池(Singleton Objects Map),等待被业务代码调用。
  2. 销毁(Destruction):当容器关闭时,执行销毁逻辑(@PreDestroy等)。

3. 核心机制:三级缓存(解决循环依赖)

管理中最难的部分是:如果 A 依赖 B,B 也依赖 A 怎么办?

容器通过三级缓存(本质是三个 Map)来解决这个问题:

  • 一级缓存(singletonObjects):存放完全初始化好的、可以直接用的“成品”Bean。
  • 二级缓存(earlySingletonObjects):存放已经实例化、但还没填充属性的“半成品”Bean。
  • 三级缓存(singletonFactories):存放创建 Bean 的工厂对象,用来处理 AOP 情况下的循环依赖。

逻辑:A 创建时发现依赖 B,先把自己这个“半成品”挂在缓存里,跑去创建 B;B 发现依赖 A,直接从缓存里拿走 A 的“半成品”完成创建,再回头把完整的 B 给 A。


4. BeanFactory vs ApplicationContext

容器的管理能力也分等级:

特性BeanFactoryApplicationContext
定位底层接口,提供基本容器功能。高级容器,继承了前者。
加载时机懒加载。只有获取 Bean 时才创建。预加载。容器启动时就创建所有单例。
扩展功能无。支持 AOP、国际化、事件广播、资源访问。
应用场景移动端或资源极度受限环境(现已少用)。几乎所有 Spring/Spring Boot 应用。

总结

容器管理 Bean 的本质是:利用BeanDefinition统一标准,利用“反射 + 缓存”实现自动化组装,利用“生命周期接口”提供可扩展性。

你现在已经看过了 Bean 的创建、销毁、以及容器的管理逻辑。你是否好奇过,为什么 Spring 默认要把 Bean 设计成单例(Singleton),这种设计在处理高并发请求时会有什么潜在的“坑”?

http://www.jsqmd.com/news/786324/

相关文章:

  • 2026年近期大庆企业如何选择专业可靠的短视频服务伙伴? - 2026年企业推荐榜
  • 云原生性能测试平台OpenClaw Cloud:架构解析与实战部署指南
  • 第四篇:RDB与AOF持久化——宕机后数据怎么恢复?
  • 2026年最新趋势:西安外贸企业如何选择建站服务商突围海外市场? - 2026年企业推荐榜
  • 认知科学视角下的AGI评测:超越传统基准的多维能力评估框架
  • AI工作流引擎:构建可观测、可扩展的AI应用开发框架
  • 抖音直播录制神器:40+平台自动值守,永久保存精彩瞬间
  • 通用人工智能系统(GPAIS)的技术挑战与可信AI治理框架
  • AutoKG:大语言模型与远程监督驱动的自动化知识图谱构建实战
  • CANN/ascend-transformer-boost算子演示示例
  • GitHub中文界面终极指南:3步免费快速安装,告别英文困扰
  • Xbox成就解锁器完全指南:轻松解锁Xbox游戏成就的免费神器
  • CentOS 7 网卡没有 IP 地址的解决方法
  • AI系统设计实战指南:从RAG到Agentic Workflow的架构思维
  • 2026年5月更新:上海基站叠光解决方案官方推荐品牌盘点,汇珏科技集团入选 - 2026年企业推荐榜
  • CANN学习中心:SuperKernel技术综述
  • Neovim集成AI插件llm.nvim:本地大模型编程助手实战指南
  • Spring Cloud 为什么需要服务注册与发现中心这些东西?
  • 网络数据处理利器NadirClaw:从BPF过滤到自定义协议解析的深度实践
  • 为 Hermes Agent 框架配置 Taotoken 作为自定义模型供应商的详细步骤
  • VMware Unlocker 3.0:专业解锁工具让PC轻松运行macOS虚拟机的高效指南
  • ShellGPT:用自然语言驱动命令行,AI赋能开发运维效率革命
  • AI赋能宠物纪念册:Gemini3.1Pro的情感文案术
  • 2026年当下,为何广西万卫保安服务有限公司成为明星保安品牌首选? - 2026年企业推荐榜
  • GoAmzAI:基于大语言模型的亚马逊卖家AI助手部署与应用实战
  • 2026年近期专业之选:杭州瑞诚教育科技有限公司建筑资质升级服务解析 - 2026年企业推荐榜
  • 卷积改进与轻量化:Omni-Kernel 大核卷积设计:31×31 深度卷积搭配轴向分解,无缝接入 YOLOv11
  • R-CNN之父、何恺明前同事Ross Girshick正式加入Anthropic
  • 2026 AI大会报名通道即将关闭:3大未公开优先注册通道+5类免审资格今日解锁
  • 全球南方AI治理:从规则接受者到参与者的战略转型与安全路径