contents
调用生成beanFactory
BeanFactory定制
AbstractApplicationContext#obtainFreshBeanFactory
方法中调用了AbstractRefreshableApplicationContext#customizeBeanFactory
自定义此上下文使用的内部bean工厂。每次调用AbstractApplicationContext#refresh()
尝试调用。默认实现应用此上下文的“允许Bean定义覆盖”和“允许循环引用”设置(如果指定)。可以在子类中重写,以自定义默认ListableBeanFactory的任何设置。
通过Xml bean Definition Reader加载bean定义。
AbstractApplicationContext#obtainFreshBeanFactory
方法中调用了AbstractXmlApplicationContext#loadBeanDefinitions()
这个便是核心的bean加载了
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
// Create a new XmlBeanDefinitionReader for the given BeanFactory.
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
// Configure the bean definition reader with this context's
// resource loading environment.
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
// Allow a subclass to provide custom initialization of the reader,
// then proceed with actually loading the bean definitions.
initBeanDefinitionReader(beanDefinitionReader);
loadBeanDefinitions(beanDefinitionReader);
}
beanDefinitionReader.setEnvironment()
设置读取bean定义时要使用的环境beanDefinitionReader.setResourceLoader()
设置用于资源位置的资源加载器。beanDefinitionReader.setEntityResolver()
设置用于解析的SAX实体解析器。默认情况下,将使用资源实体解析器。可以为自定义实体解析重写,例如相对于某些特定的基路径。initBeanDefinitionReader()
AbstractXmlApplicationContext#initBeanDefinitionReader() 初始化用于加载此上下文的bean定义的bean定义读取器。默认实现为空。可以在子类中重写,例如用于关闭XML验证或使用不同的XML Bean Definition Parser实现。loadBeanDefinitions()
AbstractXmlApplicationContext#loadBeanDefinition使用给定的Xml bean Definition Reader加载bean定义。bean工厂的生命周期由刷新bean工厂方法处理;因此,该方法只需要加载和/或注册bean定义。
loadBeanDefinitions()
内部根据xml是DTD或XSD定义校验xml文档格式是否正确