工作来几乎所有的项目都用到了spring,却一直没有系统的读下源码,从头开始系统的读下吧,分章也不那么明确,读到哪里记到哪里,仅仅作为个笔记吧。

先看ClassPathXmlApplicationContext的类图

有人说:BeanFactory是Spring的心脏,ApplicationContext就是完整的躯体。ApplicationContext继承了BeanFactory,ResourceLoader提供了类的管理以及资源的加载,同时又继承了EnvironmentCapable,MessageSource, ApplicationEventPublisher等,将环境、消息、事件等统一管理,真是的算上一个完整的躯干了。

简单使用:

        ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/test-spring.xml");User user = context.getBean(User.class);System.out.println(user.getId());

ApplicationContext的初始化时序图如下:

1、super(parent)调用父类构造函数,在AbstractApplicationContext中会初始化resourcePatternResolver。

2、setConfigLocations(configLocations)解析spring的配置文件地址,设置到configLocations。

3、refresh()这是ApplicationContext初始化的核心,会在这里初始化BeanFactory,解析XML加载BeanDefinition,注册bean处理器,注册事件添加监听等

3.1 prepareRefresh(),初始化基础属性值3.2 obtainFreshBeanFactory(),这里会再执行refreshBeanFactory时候创建一个默认的BeanFactory:DefaultListableBeanFactory,并加载BeanDefinition。
加载BeanDefinition是会创建一个XmlBeanDefinitionReader对象,交由XmlBeanDefinitionReader去进行加载。这里处理的比较复杂后面单独分析下XmlBeanDefinitionReader。3.3 prepareBeanFactory(beanFactory),为beanFactory设置一些属性如ClassLoader,BeanExpressionResolver,PropertyEditorRegistrar,BeanPostProcessor等3.4 invokeBeanFactoryPostProcessors(beanFactory),为beanFactory注册BeanFactoryPostProcessor3.5 registerBeanPostProcessors(beanFactory),注册当Bean创建时候的BeanPostProcessor3.6 initMessageSource()初始化上下文的消息源:DelegatingMessageSource3.7 initApplicationEventMulticaster()初始化了一个事件传播器:SimpleApplicationEventMulticaster3.8 registerListeners()获取ApplicationListener,并在事件传播器中注册他们3.9 finishBeanFactoryInitialization(beanFactory),获取LoadTimeWeaverAware并初始化他们,初始化单例并且非懒加载的Bean3.10 finishRefresh()完成refresh Context操作,初始化LifecycleProcessor并start,发布ContextRefreshedEvent事件3.11 resetCommonCaches()主要是清理缓存

一个ClassPathXmlApplicationContext的初始化过程基本如上,详细的BeanDefinition加载过程,获取Bean操作后续再写吧。

转载于:https://www.cnblogs.com/lcxdever/p/9281140.html

读spring源码(一)-ClassPathXmlApplicationContext-初始化相关推荐

  1. 想读Spring源码?先从这篇「 极简教程」开始

    来自:Java中文社群 为什么要阅读源码?这是一个有趣的问题,类似的问题还有,为什么要看书?为什么要爬山? 这也是一个哲学问题,我想每个人都有不同的答案,下面我是对阅读源码好处的一些思考.(PS:也欢 ...

  2. 想读Spring源码?先从这篇「 极简教程」开始吧...

    为什么要阅读源码?这是一个有趣的问题,类似的问题还有,为什么要看书?为什么要爬山? 这也是一个哲学问题,我想每个人都有不同的答案,下面我是对阅读源码好处的一些思考. (PS:也欢迎你在评论区留言补充) ...

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

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

  4. Spring源码解读(一)——容器是如何初始化的

    为什么要读源码 Spring是一群优秀的框架组成的社区.现在已经非常丰富了.当我们享受着Spring带来的便利同时,有时也想一探究竟. 人人都说Spring好,难免有人趋之若鹜,如果让你说出个究竟,你 ...

  5. spring源码学习:spring初始化流程

    首先借个图,说明一下spring的bean的整个生命流程. 销毁什么的这个看图就知道怎么回事,使用的话一般都是纯业务,而且我们更关心spring是怎么初始化的,初始化成我们定义的那个样子.我们就是以这 ...

  6. idea调试源代码c语言,IDEA阅读spring源码并调试

    目标:搭建起Spring源码阅读和代码调试跟踪的环境,顺便建立一个简单的Demo,能够调试Spring的源代码 本节,主要介绍一下Spring源码阅读和调试的相关环境搭建,并使用MVN创建一个非常简单 ...

  7. spring源码分析之Aop

    今天读spring源码,读到aop相关内容,在此记录一下,以便以后复习和查阅. 一.spring如何实现Aop 这里简单的说下原理,spring实例化bean要经历一套完整的生命周期,在这个过程中会对 ...

  8. Spring源码篇一之beanFactory的真身和6大后置处理器的注册

    当你的才华还撑不起你的野心的时候,唯有静下心来学习. spring运行流程图(https://www.processon.com/view/5f3fcab8e0b34d07118258cb?fromn ...

  9. Spring源码之BeanDifinition(加几行代码,可以产出让队友几天也找不出的Bug)

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger 种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq ...

最新文章

  1. Caused by: org.gradle.api.InvalidUserDataException: NDK not configured
  2. boost::hana::cartesian_product用法的测试程序
  3. 003Java语言环境搭建
  4. 安装 java decompiler_Eclipse离线安装Java Decompiler插件(反编译)
  5. Spring MVC:带有CNVR卷的REST应用程序。 1个
  6. 光纤收发器常见故障及解决方法
  7. matlab 微秒 符号,matlab处理csi
  8. 用Java代码在ElasticSearch中索引PDF文件?
  9. thoughtworks笔试整理【转载】
  10. java 实现复制_在java中如何实现复制,粘贴,剪切
  11. php操作mysql数据库的基本类
  12. 深度linux运行浏览器中毒,使用深度Deepin系统的用户可在商店中安装360安全浏览器正式版...
  13. Centos7安装Caffe教程
  14. MySQL 安装及配置 Navicat 工具
  15. 蓝桥杯单片机学习之数码管
  16. 保险中介3.0时代:数字化中介在场景中打造核心竞争力
  17. Buct oj 1019
  18. c语言编程单片机中的sbit,单片机sfr和sbit的用法
  19. 图书推荐系统(附源码链接)
  20. 动态规划算法问题分析_背包问题_求相隔数据之间最大和_算法理解

热门文章

  1. 每天一道LeetCode-----将字符串的连续相同的字符合并成一个字符后加个数
  2. 每天一道LeetCode-----给定字符串s和字符数组words,在s中找到words出现的位置,words内部字符串顺序无要求
  3. 操作系统P,V(wait,signal原语)操作讲解,以及两个例题(答案仅供参考)
  4. 第五章 PX4-Pixhawk-GPS解析
  5. Windows桌面任务栏透明化
  6. 数据挖掘-亲和性分析函数(通用)
  7. 递归与分治——二分查找算法(折半查找算法)
  8. 中文 代码 谷歌_Chrome谷歌浏览器下不支持css字体小于12px的解决办法
  9. android gis 框架,三、ArcGis For Android:图层(Layers)
  10. java https jasonrpc_以太坊 ethereum JSON-RPC java 调用示例