创建容器对象:DefaultListableBeanFactory
加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
refreshBeanFactory()
初始化BeanFactory,并进行XML文件读取,并将得到的BeanFactory记录在当前实体的属性中
customizeBeanFactory(beanFactory)
定制beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖
此处子类重写父类方法设置可生效
loadBeanDefinitions(beanFactory)
初始化documentReader,并进行XML文件读取及解析,默认命名空间的解析,自定义标签的解析
这里有一系列重载,首先通过适配器模式来处理beanFactory,new一个beanDefinitionReader,完成一些设置并初始化。
继续重载,以String的形式获得配置文件的位置,此时是一个String数组
遍历数组,单独处理每一个String元素
获取resourceLoader对象,并完成具体的Resource定位,此时是一个Resource数组
遍历Resource数组,单独处理Resource元素,继续重载,从encodedResource中获取已经封装的Resource对象并再次从Resource中获取其中的inputStream
核心处理逻辑
此处获取xml文件的document对象,这个解析过程是由documentLoader完成的
注册Bean的定义信息
具体解析过程,此处有一个代理对象
根据不同的命名空间属性做不同的处理
下方为自定义命名空间处理方法。
从配置的映射中找到提供的命名空间
调用自定义的NamespaceHandler进行解析
具体的解析方法
解析内部,并返回解析完成的beanDefinition
向beanFactory注册beanDefinition
将beanDefinition数据放入map和list
