spring的ioc容器初始化细节
定位配置文件,解析配置文件成beandefinition,注入ioc容器
配置文件构造方法
setConfigLocations(),设置应用程序上下文的配置路径,资源文件的路径
getEnvironment()获取环境变量
createEnvironment()
StandardEnvironment(),创建标准环境
这个StandardEnvironment类是没有构造函数,默认是无参构造,调用父类AbstractEnvironment的无参构造
AbstractEnvironment,自定义属性源,可以拓展想要定义的属性
最终调回StandardEnvironment的customizePropertySources()方法
resolveRequiredPlaceholders(path),解析所需的占位符,匹配一些${ }的占位符
doResolvePlaceholders的parseStringValue() 将配置文件中的占位符进行值的替换处理
替换完资源文件路径的占位符,容器开始初始化
refresh()
一.prepareRefresh()方法
前戏,做容器刷新前的准备工作
1、设置容器的启动时间
2、设置活跃状态为true
3、设置关闭状态为false
4、获取Environment对象,并加载当前系统的属性值到Environment对象中
5、准备监听器和事件的集合对象,默认为空的集合
initPropertySources(),留给子类实现,初始化属性资源
初始化属性拓展,自定义属性值,环境变量进行替换
二、ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
创建容器对象:DefaultListableBeanFactory,当前有容器销毁再创建新容器,加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
refreshBeanFactory() 初始化BeanFactory,设置BeanFactory的属性,并进行XML文件读取,并将得到的BeanFactory记录在当前实体的属性中.
getBeanFactory() 返回当前实体的beanFactory属性
createBeanFactory(),创建DefaultListableBeanFactory对象
customizeBeanFactory(beanFactory);定制化beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖
loadBeanDefinitions() 初始化documentReader,设置环境变量,资源解析器,并进行XML文件读取及解析,默认命名空间的解析,自定义标签的解析
开始beanDefinition的加载
将资源文件 从String[]-string-Resource[]- resource,最终开始将resource读取成一个document文档,根据文档的节点信息封装成一个个的BeanDefinition对象
registerBeanDefinitions()根据文档的节点信息封装成一个个的BeanDefinition对象
创建BeanDefinitionParserDelegate解析器来解析封装成beandefinition
默认命名空间标签,import,alias,bean,beans
解析bean标签的处理
parseBeanDefinitionElement()
解析bean元素,得到BeanDefinitionHolder,beanDefinitionHolder是beanDefinition对象的封装类,封装了BeanDefinition,bean的名字和别名,用它来完成向IOC容器的注册,得到的beanDefinitionHolder说明意味beandefinition是通过BeanDefinitionParserDelegate对xml元素的信息按照spring的bean规则进行
parseBeanDefinitionElement() ,对bean元素详细解析
解析完获得一个完整的BeanDefinitionHolder,包含beanDefinition、beanName,别名数组
对解析获得BeanDefinitionHolder进行装饰,如果适用,通过名称空间的handler修饰给bean定义信息
registerBeanDefinition(),向ioc容器注册解析得到的beandefinition
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()); 解析的beanDefinition注册到ioc容器