BeanDefinition 的加载与注册
BeanDefinition 的加载与注册
回顾之前
我们看到 refresh() 方法的执行步骤,其中 第 2 步:obtainFreshBeanFactory() 很关键。
它会:
创建 BeanFactory
加载并解析配置文件(比如 XML)
把解析结果放到 BeanFactory 里
关键类:XmlBeanDefinitionReader
在 ClassPathXmlApplicationContext 里,加载配置的逻辑大致是:
1 | protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) { |
XmlBeanDefinitionReader 的任务:
- 读取 XML 文件
- 把
标签解析成 BeanDefinition 对象 - 注册到 BeanDefinitionRegistry(其实就是 BeanFactory)
什么是 BeanDefinition?
Spring 用 BeanDefinition 来保存 Bean 的元信息:
比如:
1 |
|
会解析成类似结构:
1 | BeanDefinition { |
加载流程源码
在 XmlBeanDefinitionReader 里核心方法是:
1 | public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException { |
关键调用链:
- doLoadDocument → 用
DocumentLoader
把 XML 文件读成 DOM - registerBeanDefinitions → 用
BeanDefinitionDocumentReader
解析 DOM - parseBeanDefinitionElement → 遇到
<bean>
标签时,解析成BeanDefinition
- registry.registerBeanDefinition → 存入
DefaultListableBeanFactory
的 Map
BeanDefinition 注册
最终会走到 DefaultListableBeanFactory
的方法:
1 |
|
📌 这一步就把 配置文件里的 bean -> BeanDefinition 对象 存到 beanDefinitionMap 里。
后续实例化 Bean 时,就会从这里读取定义。
调试建议
- 在
XmlBeanDefinitionReader#loadBeanDefinitions
打断点 - 看
doc
(Document 对象)里是不是能看到<bean>
节点 - 进入
BeanDefinitionParserDelegate#parseBeanDefinitionElement
,观察是如何读取id
和class
- 最后在
DefaultListableBeanFactory#registerBeanDefinition
看 Map 里多了myService
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.