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

转载于:https://www.cnblogs.com/sunshine-2015/p/5982714.html

spring源码 — 一、IoC容器初始化相关推荐

  1. Spring源码分析——IOC容器

    1.IOC容器的概念 理解IOC容器的概念之前首先需要了解依赖翻转(又称依赖倒置)的概念 许多复杂的应用都是通过多个类之间的彼此合作实现业务逻辑的,这使得每个对象都需要管理自己与其合作对象的依赖,而如 ...

  2. 【框架源码】Spring源码底层IOC容器加入对象的方式

    1.Spring容器加入对象方式简介 使用XML配置文件 在XML配置文件中使用< bean >标签来定义Bean,通过ClassPathXmlApplicationContext等容器来 ...

  3. Spring源码:IOC容器

    Spring IOC 容器 最底层的IOC容器BeanFactory. 高级形态的IOC容器ApplicationContext. BeanFactory相关类图: ApplicationContex ...

  4. 手撸spring源码分析IOC实现原理

    手撸spring源码分析IOC实现原理 文章出处:https://github.com/fuzhengwei/small-spring 根据小付哥的手撸spring核心源码一步步学习出来的结果收货总结 ...

  5. Spring源码(十)-IOC终结篇

    前言 不知不觉,Spring源码已经写了9篇,这一章就画上一个句号了,IOC这块就暂时结束.这一篇就之前的内容做些总结,主要写一些大致的流程. [详细参考]bean的初始化 1.bean的生命周期 1 ...

  6. 从Spring源码探究IOC初始化流程

    随着不断地使用Spring,以及后续的Boot.cloud,不断的体会到这个拯救Java的生态体系的强大,也使我对于这个框架有了极大的好奇心,以至于产生了我为什么不能写一个这样的框架的思考. 通过自学 ...

  7. java spring ioc 实例_Spring 源码阅读(IOC容器)-bean的实例化以及注入

    3.Bean的实例化以及注入过程分析 Bean的实例以及注入是在getBean时触发的,由于外部容器是与外部调用交互的桥梁,我们首先从外部容器入手,AbstractApplicationContext ...

  8. 简述控制反转ioc_阅读Spring源码:IOC控制反转前的处理

    温馨提示:要怀着 这个世界很美好 的心态去看~ 技术经验交流:点击入群 ClassPathXmlApplicationContext的注册方式 源码分析基于Spring4.3 从ClassPathXm ...

  9. Spring5源码 - 00 IOC容器创建_前期准备

    文章目录 实例化容器 源码分析 this 调用父类的构造函数 然后调用自己的构造函数 new AnnotatedBeanDefinitionReader(this); new ClassPathBea ...

  10. 深入浅出Spring源码:IOC原理解析(一)

    IOC(Inversion of Control),即控制反转,意思是将对象的创建和依赖关系交给第三方容器处理,我们要用的时候告诉容器我们需要什么然后直接去拿就行了.举个例子,我们有一个工厂,它生产各 ...

最新文章

  1. 2022-2028年中国B2C电子商务市场投资分析及前景预测报告
  2. 两位院士同时受聘,山东大学再添强援
  3. [数据结构] 迷宫问题(栈和队列,深搜和广搜)
  4. 如何在高并发环境下设计出无锁的数据库操作(Java版本) 转载
  5. 洛谷 P3805 manacher算法
  6. C/C++字节对齐总结
  7. 异步通知实验(信号)
  8. C++入门经典-例2.13-左移运算
  9. html文件怎么导出stl文件,各种3D建模软件导出STL文件的小技巧(一)
  10. 作者:姚阳(1979-),女,广州市社会科学院经济学副研究员。
  11. jQuery 集合 搜索操作(父辈元素搜索、同辈元素搜索、子元素搜索)
  12. 利用多进程/多线程实现多个客户端同时访问同一服务器
  13. 给自己的Web站点嵌入一个免费的图片编辑器
  14. 【GEEK】win10下cmd美化
  15. 软总线源码分析8:传输模块
  16. c语言中cap捕捉函数,CAP理论的理解
  17. sa-token 注解式鉴权
  18. 密码学之数字信封 Digital_Envelope(project完整代码)
  19. 【stream】stream流基础知识
  20. NE555+CD4017l流水灯原理图

热门文章

  1. vs2008【断点无效】解决方法
  2. Flex值得一看参考资源
  3. ROS学习(七):ROS launch 文件
  4. HTML中nbsp; ensp; emsp; thinsp;等6种空白空格的区别
  5. 分享一个外星人蓝屏的问题解决方法
  6. 【Spring】BeanUtils.copyPorperties()的IllegalArgumentException原因分析
  7. 马哥学习笔记——shell变量类型
  8. 【转】每天一个linux命令(53):route命令
  9. 前端代码标准最佳实践:HTML篇
  10. jQuery - 获取并设置 CSS 类