spring源码 — 一、IoC容器初始化
IoC容器初始化
注意:本次的spring源码是基于3.1.1.release版本
容器:具有获取Bean功能——这是最基本功能,也是BeanFactory接口定义的主要行为,在添加了对于资源的支持之后就是ApplicationContext。对于容器的理解可以是:
- 在一个HashMap中存放着很多bean
- 可以解析依赖并初始化bean
所以IoC初始化主要完成以下任务:
- 定位资源,也就是配置bean的xml
- 加载资源,将xml中配置的bean解析为BeanDefinition
- 注册bean,将BeanDefinition添加到一个ConcurrentHashMap中
以ClassPathXmlApplicationContext的初始化为例说明初始化过程
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
ClassPathXmlApplicationContext
从这个类的构造函数开始
1.super(parent);
调用超类AbstractApplicationContext的的构造方法,因为这个就是root容器,所以parent是null
- 初始化patternResolver-PathMatchingResourcePatternResolver,按照path解析资源位置
- 初始化StandardEnvironment(非web环境),提供一些property配置
2.setConfigLocations
- 解析xml的路径,有可能包含多个配置文件,比如:/WEB-INF/*-context.xml
3. refresh
调用的是超类AbstractApplicationContext的refresh方法
AbstractApplicationContext
这个类是ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等容器的超类,这些类的初始化都会调用到超类的refresh方法,refresh主要进行以下操作:
- prepareRefresh:解析xml文件中的placeholder,替换为指定值(由子类重写)
- obtainBeanFactory
- 新建一个beanFactory:DefaultListableBeanFactory
- loadBeanDefinition
- 构造XmlBeanDefinitionReader,设置resourceLoader和Environment
- prepareBeanFactory:设置beanFactory上下文
- invokeBeanFactoryPostProcessors:调用实现了BeanFactoryPostProcessor的类
- registerBeanPostProcessors:注册bean初始化时候的processor,包括bean init before和after
- initMessageSource
- initApplicationEventMulticaster
- onRefresh:初始化子容器
- registerListeners:注册实现了ApplicationListener的listener
- finishBeanFactoryInitialization:初始化配置为lazy-init=false的bean
- finishRefresh:触发所有坚挺ContextRefreshedEvent事件的listener
接下来主要关注obtainBeanFactory,因为容器的创建和初始化就在这个方法中,调用时序如下:
在AbstractRefreshableApplicationContext.refreshBeanFactory中创建了DefaultListableBeanFactory,并开始加载BeanDefinition,load过程如下:
- 调用了AbstractXmlApplicationContext.loadBeanDefinitions
- 新建XmlBeanDefinitionReader
- 调用XmlBeanDefinitionReader.loadBeanDefinitions,主要的load工作在这个类(会使用到父类中的一些方法)中进行
XmlBeanDefinitionReader
AbstractBeanDefinitionReader(XmlBeanDefinitionReader父类)
这个类中主要对资源进行转换,转换为Document之后交给DefaultBeanDefinitionDocumentReader
循环取出所有配置,针对每个配置进行load
每个配置的资源转换如下:
location->resource->encodeResource->inputStream->document
DefaultBeanDefinitionDocumentReader
- 解析document为BeanDefinition并注册
- 调用容器的DefaultListableBeanFactory.registerBeanDefinition将BeanDefinition注册到beanDefinitionsMap
spring源码 — 一、IoC容器初始化的更多相关文章
- Spring源码解析-ioc容器的设计
Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...
- spring 源码之 ioc 容器的初始化和注入简图
IoC最核心就是两个过程:IoC容器初始化和IoC依赖注入,下面通过简单的图示来表述其中的关键过程:
- Spring源码阅读-IoC容器解析
目录 Spring IoC容器 ApplicationContext设计解析 BeanFactory ListableBeanFactory HierarchicalBeanFactory Messa ...
- Spring 源码剖析IOC容器(一)概览
目录 一.容器概述 二.核心类源码解读 三.模拟容器获取Bean ======================= 一.容器概述 spring IOC控制反转,又称为DI依赖注入:大体是先初始化bean ...
- Spring源码解析-IOC容器的实现
1.IOC容器是什么? IOC(Inversion of Control)控制反转:本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IOC容器,Spring的IO ...
- SPRING源码分析:IOC容器
在Spring中,最基本的IOC容器接口是BeanFactory - 这个接口为具体的IOC容器的实现作了最基本的功能规定 - 不管怎么着,作为IOC容器,这些接口你必须要满足应用程序的最基本要求: ...
- Spring源码解析-IOC容器的实现-ApplicationContext
上面我们已经知道了IOC的建立的基本步骤了,我们就可以用编码的方式和IOC容器进行建立过程了.其实Spring已经为我们提供了很多实现,想必上面的简单扩展,如XMLBeanFacroty等.我们一般是 ...
- Spring源码之IOC容器创建、BeanDefinition加载和注册和IOC容器依赖注入
总结 在SpringApplication#createApplicationContext()执行时创建IOC容器,默认DefaultListableBeanFactory 在AbstractApp ...
- spring源码浅析——IOC
=========================================== 原文链接: spring源码浅析--IOC 转载请注明出处! ======================= ...
- spring源码分析---IOC(1)
我们都知道spring有2个最重要的概念,IOC(控制反转)和AOP(依赖注入).今天我就分享一下spring源码的IOC. IOC的定义:直观的来说,就是由spring来负责控制对象的生命周期和对象 ...
随机推荐
- 如何在MAC上使用SVN,简单几行命令搞定
如果你要使用SVN管理代码,如果不是迫不得已,还是看看git吧,但是SVN也要知道怎么用,原理是相似的. 首先,要准备的东西:svnX软件 https://pan.baidu.com/s/1mhEay ...
- EditText的一些属性及用法
EditText的一些属性及用法设置当EditText获得焦点时把文本框的内容全选中android:selectAllOnFocus="true"设置某个EditText默认获得焦 ...
- 交换机和VLAN
交换机 交换机的两个作用:一是维护CAM表,CAM表是计算机的MAC地址和交换机端口的映射表:另一个是根据CAM来进行数据的转发. 以太网交换机转发数据帧有三种方式: 1.存储转发:即先存储后转发的方 ...
- 使用 IntraWeb (44) - 测试读取 SqLite (三)
使用数据连接池(TIWDataModulePool). 新建工程时勾选 Pool Data Connections: 新增的 Pool(TIWDataModulePool) 被放在 ServerCon ...
- jsp_属性范围_page
page属性范围(使用pageContext表示,但是一般习惯于将这种范围称为page范围)表示将一个属性设置在本页上,页面跳转之后无法取得. 下面我们来写两个小例子测试一下: 1.在同一个jsp页面 ...
- Ubuntu下制作ISO文件
利用Ubuntu自带的命令mkisofs就可以制作iso文件,具体方法如下: 1. 如果你是直接从cd压制iso文件的,执行 sudo umount /dev/cdromdd if=/dev/cd ...
- React Native填坑之旅--HTTP请求篇
如果不能从头到尾的建立一个RN应用,那么RN将失色不少.本以为HTTP请求部分需要使用Native的实现,Android和iOS各回各家,各调各库了.Google了一下之后居然RN可以使用fetch库 ...
- 『TCP/IP详解——卷一:协议』读书笔记——06
2013-08-20 14:41:01 2.8 最大传输单元MTU MTU,最大传输单元:以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节.这个不同网络对应的传输上限 ...
- 第三天:DOM EventListener 句柄的添加和移除
1.事件句柄的包含如下两个方法: ps:使用句柄的好处是,修改方法的名称时,不需要改变多处 1.添加一个句柄, 2.添加多个句柄不会覆盖,运行结果:点击“按钮”,弹出框hello,确定后,自动弹出框w ...
- 关于QT的系统总结
编译环境与开发流程 开发QT有两种IDE可以使用,一种是使用 VS + Qt 的插件,另一种就是使用QtCreator工具.前一种是微软的工具,用的都比较多容易上手,缺点是信号槽的支持不太好,需要手写 ...