IoC容器初始化

注意:本次的spring源码是基于3.1.1.release版本

容器:具有获取Bean功能——这是最基本功能,也是BeanFactory接口定义的主要行为,在添加了对于资源的支持之后就是ApplicationContext。对于容器的理解可以是:

  • 在一个HashMap中存放着很多bean
  • 可以解析依赖并初始化bean

所以IoC初始化主要完成以下任务:

  1. 定位资源,也就是配置bean的xml
  2. 加载资源,将xml中配置的bean解析为BeanDefinition
  3. 注册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

最新文章

  1. ASP.NET MVC Model元数据(一)
  2. HTML标签marquee实现滚动效果
  3. C++中的运算符重载注意事项
  4. 常见mongo命令
  5. iOS通过http post上传图片 (转)
  6. 在CG/HLSL中访问着色器属性(Properties)
  7. Effective C++:规定12:不要忘了复制的对象时,它的每一个组成部分
  8. Node.js: What is the best "full stack web framework" (with scaffolding, MVC, ORM, etc.) based on Node.js / server-side JavaScript? - Quora
  9. OPENSSL简介
  10. 安装Linux内核源代码
  11. laravel之构造器操作数据库
  12. 第八篇——Struts2的处理结果类型
  13. More is better
  14. [lisp] scheme环境搭建与编译运行
  15. 使用JDBC向Kudu表插入中文数据乱码(转载)
  16. 多线程情况下HashMap死循环的问题
  17. 03: 自定义异步非阻塞tornado框架
  18. ContentPresenter
  19. URL转义字符
  20. SSIS 自测题-文件操作类

热门文章

  1. sql server 2000通过机器名可以连,通过ip连不上的问题
  2. Java关键字:transient,strictfp和volatile简介
  3. XE3随笔5:Format与转义字符
  4. [VS2013]如何闪开安装VS2013必须要有安装IE10的限制
  5. centos 6.5 + php5.5.31 fastcgi (fpm) 编译安装
  6. java操作word,excel,pdf
  7. java经典50编程题
  8. 2015年8月17日,杨学明老师《产业互联网化下的研发模式转型》在中国科学院下属机构CNNIC成功举办!
  9. 微软分布式框架Orleans开源了
  10. 阿里云服务器PPTP VPN安装记录