spring 源码分析--IOC容器初始化三
接着说第一节里面的第二个函数和第三个函数:第二个函数很简单创建一个 DefaultListableBeanFactory,从前面看,先是销毁了老的bean,第二个函数创建了新的工厂,,第三个函数自然就是去解析我们的文件,真正的去做初始化的工作了。
1.2.2.1.2 createBeanFactory() :在类 AbstractRefreshableApplicationContext 中仅仅只调用如下方法:
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
我们首先去看 DefaultListableBeanFactory 的构成函数,发现需要传入一个 BeanFactory 的参数。 然后再看函数: getInternalParentBeanFactory() 。方法体也只有一句话
return (getParent() instanceof ConfigurableApplicationContext ) ?((ConfigurableApplicationContext ) getParent()).getBeanFactory() : (BeanFactory) getParent();
在看函数 getParent() 事实上返回父类 AbstractApplicationContext 里的字段
private ApplicationContext parent ;
1.2.2.1.3 loadBeanDefinitions(beanFactory) :通过一个 XmlBeanDefinitionReader 装载 bean 定义。 在类:
AbstractXmlApplicationContext 中的实现为:
==================================================================
/**
* 这里使用 XMLBeanDefinitionReader 来载入 bean 定义信息的 XML 文件,查看
* XMLBeanDefinitionReader 构造函数需要的是一个 BeanDefinitionRegistry 类。
* 查看类图, DefaultListableBeanFactory 实现了 BeanDefinitionRegistry 类,
*/
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory) ;
/**
* 这里配置 reader 的环境,其中 ResourceLoader 是我们用来定位 bean 定义信息资源位置的
* 因为上下文本身实现了 ResourceLoader 接口,所以可以直接把上下文作为
* ResourceLoader 传递给 XmlBeanDefinitionReader
*/
beanDefinitionReader.setResourceLoader( this );
beanDefinitionReader.setEntityResolver( new ResourceEntityResolver( this ));
// 该方法为一个空的方法,用以允许子类实现,来初始化 the reader,
initBeanDe finitionReader(beanDefinitionReader);
// 这里转到定义好的 XmlBeanDefinitionReader 中对载入 bean 信息进行处理
loadBeanDefinitions(beanDefinitionReader);
====================================================================
1.2.2.1.3.1 loadBeanDefinitions(beanDefinitionReader): 使用传进来的
XmlBeanDefinitionReader 来装载 bean 的定义。在 AbstractXmlApplicationContext 中的定义:
====================================================================
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader){
// 函数: getConfigResources 代码: return null;
Resource[] configResources = getConfigResources();
if (configResources != null ) {
reader .loadBeanDefinitions(configResources);
}
/**
* 得到 AbstractRefreshableConfigApplicationContext 的字 段 configLocations
* 的值,也就 FileSystemXmlApplicationContext (String configLocation) 的参数。(前面函数1.1 将值存入)
*/
String[] configLocations = getConfigLocations();
if (configLocations != null ) {
/ / 调用 XmlBeanDefinitionReader 来载入 bean 定义信息。
reader.loadBeanDefinitions(configLocations) ;
}
}
====================================================================
本站支持 pay for your wishes
上一篇: 07_Redis_订阅与发布
下一篇: 06_Redis_java操作redis
推荐阅读
-
SpringBoot 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)
-
spring源码分析系列5:ApplicationContext的初始化与Bean生命周期
-
spring源码分析6: ApplicationContext的初始化与BeanDefinition的搜集入库
-
Spring源码剖析2:Spring IOC容器的加载过程
-
Spring源码分析之IoC容器初始化
-
详解Spring IOC 容器启动流程分析
-
SpringBoot 源码解析 (三)----- Spring Boot 精髓:启动时初始化数据
-
Spring源码学习(一):Spring容器创建和初始化工作准备
-
Spring 循环引用(三)源码深入分析版
-
SpringMVC源码分析--DispatcherServlet初始化的九大组件的总体概述(三)