spring ioc容器初始化本质是将bean定义解析为beandefinition并注册进内存,由refresh()驱动,分配置定位、载入解析、注册、refresh触发四步;此时仅定义就绪,未实例化bean。

Spring IoC 容器的初始化和配置加载,本质是把用户定义的 Bean 信息解析成 BeanDefinition 并注册进容器内存的过程,核心由 refresh() 方法驱动,不涉及实际 Bean 实例化(除非是非懒加载单例)。
配置资源定位:找到配置在哪
容器启动时第一件事是确定配置来源的位置。Spring 统一用 Resource 接口抽象资源,常见方式有:
-
ClassPathXmlApplicationContext:从类路径下找 XML 文件,如
"applicationContext.xml"→ 转为ClassPathResource - AnnotationConfigApplicationContext:传入 @Configuration 类或包路径 → 触发组件扫描
- 支持通配符、多个文件(如
"ctx-*.xml")、甚至远程 URL 或文件系统路径
BeanDefinition 载入与解析:把配置变成内部对象
定位完成后,读取内容并结构化为 Spring 可管理的数据模型:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- XML 场景:由
XmlBeanDefinitionReader解析 XML,逐个<bean></bean>标签转为BeanDefinition实例,填充 class、scope、property、depends-on 等属性 - 注解场景:通过
ClassPathBeanDefinitionScanner扫描指定包,识别@Component、@Service等,并生成对应BeanDefinition - Java 配置类:解析
@Bean方法,每个方法调用视为一个 Bean 定义,返回类型即 bean 类型
注册到容器:存进内存 HashMap
解析出的 BeanDefinition 不会直接生效,需注册到容器的注册中心:
- 底层使用
BeanDefinitionRegistry接口,典型实现是DefaultListableBeanFactory - 注册后,所有定义被存入
beanDefinitionMap(本质是ConcurrentHashMap<string beandefinition></string>) - 此时只是“定义就绪”,还没有创建任何 Bean 对象,也不处理依赖注入
触发 refresh() 完成初始化:真正启动容器
构造完上下文后,只要没禁用 refresh(如 new ClassPathXmlApplicationContext(..., false)),就会自动调用 refresh() —— 这才是完整初始化的入口:
- 准备环境(设置类加载器、占位符解析器、早期事件广播器等)
- 调用
obtainFreshBeanFactory():可能销毁旧工厂,新建DefaultListableBeanFactory - 执行
BeanFactoryPostProcessor(如PropertySourcesPlaceholderConfigurer处理 ${} 占位符) - 注册
BeanPostProcessor(暂不执行,留待后续 Bean 初始化时回调) - 预实例化非懒加载的 singleton Bean:遍历
beanDefinitionMap,按依赖顺序创建、注入、初始化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










