DefaultListableBeanFactory是整个bean加载的核心部分,它是Spring注册及加载bean的默认实现。
XmlBeanFactory继承自DefaultListableBeanFactory,不同的地方是在XmlBeanFactory中使用了自定义的XML读取器XmlBeanDefinitionReader,实现了XML配置文件(包括自定义标签/个性化读取)的读取.
根据配置文件,创建XmlBeanFactory实例对象,然后再调用getBean方法获得相应的bean实例.
XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("bean.xml"));
Gun gun = beanFactory.getBean("m416", Gun.class)
内部流程:
new ClassPathResource(xxx.xml)
将配置文件转换为Resource资源实例
loadBeanDefinitions(encodedResource)
将Resource转为为输入流资源InputResource.
doLoadBeanDefinitions(...)
doLoadDocument(...)
然后将Resource封装为Document实例对象.
registerBeanDefinitions(...)
注册BeanDefinition
parseBeanDefinitions(root, this.delegate)
会根据nameSpace判断是进行默认标签解析还是自定义标签解析
parseDefaultElement(ele, delegate)
针对不同标签进行解析(<bean>/<beans>/<import>/<alias>)
比如, 解析beanbean标签方法:processBeanDefinition(ele, delegate):
① 提取Element元素中的“id”和“name”属性,并将name解析为
aliases,然后为beanName赋值。
② 解析其他属性并封装到GenericBeanDefinition类型的实例中。
③ 如果发现bean没有指定beanName,那么使用默认规则生成
beanName。
④ 将获取到的信息封装到BeanDefinitionHolder类型的实例中。
最终, 通过标签的id(beanName)以及别名(alias)就可以从容器中拿
到bean的实例对象.