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

spring源码 — 一、IoC容器初始化的更多相关文章

  1. Spring源码解析-ioc容器的设计

    Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...

  2. spring 源码之 ioc 容器的初始化和注入简图

    IoC最核心就是两个过程:IoC容器初始化和IoC依赖注入,下面通过简单的图示来表述其中的关键过程:

  3. Spring源码阅读-IoC容器解析

    目录 Spring IoC容器 ApplicationContext设计解析 BeanFactory ListableBeanFactory HierarchicalBeanFactory Messa ...

  4. Spring 源码剖析IOC容器(一)概览

    目录 一.容器概述 二.核心类源码解读 三.模拟容器获取Bean ======================= 一.容器概述 spring IOC控制反转,又称为DI依赖注入:大体是先初始化bean ...

  5. Spring源码解析-IOC容器的实现

    1.IOC容器是什么? IOC(Inversion of Control)控制反转:本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IOC容器,Spring的IO ...

  6. SPRING源码分析:IOC容器

    在Spring中,最基本的IOC容器接口是BeanFactory - 这个接口为具体的IOC容器的实现作了最基本的功能规定 - 不管怎么着,作为IOC容器,这些接口你必须要满足应用程序的最基本要求: ...

  7. Spring源码解析-IOC容器的实现-ApplicationContext

    上面我们已经知道了IOC的建立的基本步骤了,我们就可以用编码的方式和IOC容器进行建立过程了.其实Spring已经为我们提供了很多实现,想必上面的简单扩展,如XMLBeanFacroty等.我们一般是 ...

  8. Spring源码之IOC容器创建、BeanDefinition加载和注册和IOC容器依赖注入

    总结 在SpringApplication#createApplicationContext()执行时创建IOC容器,默认DefaultListableBeanFactory 在AbstractApp ...

  9. spring源码浅析——IOC

    =========================================== 原文链接: spring源码浅析--IOC   转载请注明出处! ======================= ...

  10. spring源码分析---IOC(1)

    我们都知道spring有2个最重要的概念,IOC(控制反转)和AOP(依赖注入).今天我就分享一下spring源码的IOC. IOC的定义:直观的来说,就是由spring来负责控制对象的生命周期和对象 ...

随机推荐

  1. 简述UICollectionView 使用

    一.介绍 UICollectionView类负责管理数据的有序集合以及以自定义布局的模式来呈现这些数据,它提供了一些常用的表格(table)功能,此外还增加了许多单栏布局.UICollectionVi ...

  2. [学习笔记] 七步从Angular.JS菜鸟到专家(3):数据绑定和AJAX [转]

    这是"AngularJS - 七步从菜鸟到专家"系列的第三篇. 在第一篇,我们展示了如何开始搭建一个AngularaJS应用.第二篇我们讨论了scope和 $scope 的功能. 通过这整个系列的教程 ...

  3. centos python web 站点搭建

    yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel 参照:http://www.cnblogs.com/ ...

  4. Java script基础 回顾

    一.语法 代码与C#相似,变量使用的是var引用出来,包含所有类型:可以直接使用,不用定义. 也是有内置分类的.例如:var b="10"  var c=10;一个是字符串一个是整 ...

  5. Ubuntu12.04配置mod_python

    安装: sudo apt-get install libapache2-mod-python python-mysqldb 然后编辑配置文件/etc/apache2/sites-enabled/000 ...

  6. JavaScript-hash数组for in 函数

    什么是数组:内存中,连续存储多个数据的存储空间,再起一个名字为什么; 为什么:现实存储多个相关数据,都是集中存储,共同一个名字 程序=数据结构+算法 好的数据结构可以极大的提高程序的执行效率 何时使用 ...

  7. 用scala实现一个sql执行引擎-(下)

    执行 上一篇讲述了如何通过scala提供的内置DSL支持,实现一个可以解析sql的解析器,这篇讲如何拿到了解析结果-AST以后,如何在数据上进行操作,得到我们想要的结果.之前说到,为什么选择scala ...

  8. 对angular实现延迟加载template和controller

    1.在lib目录中添加 script.js 文件,并在index.html其他<script>之前引用之: <script src="lib/script.js" ...

  9. log4net简单配置内容

    首先将log4net.dll下载来,添加到项目引用中: 在assembly文件最后面加(其实没关系的): [assembly: log4net.Config.XmlConfigurator(Confi ...

  10. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...