一、 DefaultListableBeanFactory
![](https://i-blog.csdnimg.cn/blog_migrate/f54076cea53e265a324631b6abd9b981.jpeg)
1. Alias:bean的定义中,可以给bean设置别名。
// 配置文件中定义了一个JavaBean
<bean id="some" class="src.com.Some"/>
// 我要给这个JavaBean增加别名,以方便不同对象来调用。我们就可以这样写:
<bean id="some" class="src.com.Some"/>
<alias name="some" alias="someJava,oneBean,twoBean"/>
// 或者是用name属性来指定,如:
<bean id="some" name="oneBean,twoBean,threeBean" class="src.com.Some"/>
二、XmlBeanDefinitionReader
![](https://i-blog.csdnimg.cn/blog_migrate/1349c0b641796fb96bf22ff561df4f93.jpeg)
1. EnvironmentCapable:定义获取Environment方法。
Environment用来表示整个Spring应用运行时所处的环境。Capable后缀的接口在Spring中带有getXXX的含义,也就是实现了这个接口,就可以通过该接口的实例获取到XXX。
2.BeanDefinitionReader:读取bean的定义如Registry、Resource、Class。
3.doLoadBeanDefinitions()方法中的流程:
(1) 获取Resource实例
(2) 通过DocumentLoader将resource转换为Document
Document doc = doLoadDocument(inputSource, resource);
Document loadDocument(
InputSource inputSource, EntityResolver entityResolver,
ErrorHandler errorHandler, int validationMode, boolean namespaceAware)
throws Exception;
loadDocument中有个validationMode参数。这个参数指的是XML解析验证方式:DTD, XSD。
(3) 通过BeanDefinitionDocumentReader对ducument解析,并对element进行解析。
int count = registerBeanDefinitions(doc, resource);
public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
int countBefore = getRegistry().getBeanDefinitionCount();
documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
return getRegistry().getBeanDefinitionCount() - countBefore;
}
public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
this.readerContext = readerContext;
doRegisterBeanDefinitions(doc.getDocumentElement());
}