工作来几乎所有的项目都用到了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注册BeanFactoryPostProcessor
3.5 registerBeanPostProcessors(beanFactory),注册当Bean创建时候的BeanPostProcessor
3.6 initMessageSource()初始化上下文的消息源:DelegatingMessageSource
3.7 initApplicationEventMulticaster()初始化了一个事件传播器:SimpleApplicationEventMulticaster
3.8 registerListeners()获取ApplicationListener,并在事件传播器中注册他们
3.9 finishBeanFactoryInitialization(beanFactory),获取LoadTimeWeaverAware并初始化他们,初始化单例并且非懒加载的Bean
3.10 finishRefresh()完成refresh Context操作,初始化LifecycleProcessor并start,发布ContextRefreshedEvent事件
3.11 resetCommonCaches()主要是清理缓存

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

读spring源码(一)-ClassPathXmlApplicationContext-初始化的更多相关文章

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

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

  2. spring源码-bean之初始化-1

    一.spring的IOC控制反转:控制反转——Spring通过一种称作控制反转(IOC)的技术促进了松耦合.当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查 ...

  3. 读spring源码(二)-XmlBeanDefinitionReader-解析BeanDefinition

    上次说到ApplicationContext加载BeanDefinition时会创建一个XmlBeanDefinitionReader,将XML解析.BeanDefinition加载委托给XmlBea ...

  4. spring源码分析之初始化过程

    1.org.springframework.web.context.ContextLoaderListener 一个ServletContextListener,web容器启动监听器 1.1内有成员C ...

  5. 读spring源码(三)-ClassPathXmlApplicationContext-getBean

    这次主要看了下bean的生成过程,发现个画时序图很好用的软件plantuml,充分发挥程序员的能力,能用代码解决的别叨叨别的

  6. 2016.01.04接触spring一年开始读spring源码

    http://www.cnblogs.com/xing901022/p/4178963.html#_label0 遇到第一个问题The processing instruction target ma ...

  7. Spring源码剖析2:Spring IOC容器的加载过程

    spring ioc 容器的加载流程 1.目标:熟练使用spring,并分析其源码,了解其中的思想.这篇主要介绍spring ioc 容器的加载 2.前提条件:会使用debug 3.源码分析方法:In ...

  8. Spring源码剖析3:Spring IOC容器的加载过程

    本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

  9. 阅读spring源码

    读Spring源码之前,你要先清楚,为什么你要用Spring... Spring最基本的功能是做为管理bean的容器,所以我以为应该先从org.springframework.context包了解咯, ...

随机推荐

  1. iframe知识点详解

    <iframe>标签规定一个内联框架,一个内联框架被用来在当前HTML文档中嵌入另一个文档. 1. 常用属性 2. 主要API 3. 轮询 4. 长轮询 5. 自适应 6. 安全性 7. ...

  2. SpringMVC 接受请求参数、作用域传值

    目录 原生servlet接收参数 Spring MVC最基础的参数获取 接收基本数据类型参数 方法参数列表和请求参数不一致的处理方式 接收对象引用数据类型 接收复选框这种多个同名的参数 接收obj.f ...

  3. Mysql [Err] 1292 - Truncated incorrect DOUBLE value

    Mysql [Err] 1292 - Truncated incorrect DOUBLE value: 'a' - 苍 - 博客园 https://www.cnblogs.com/cang12138 ...

  4. [蓝桥杯]2014蓝桥省赛B组题目及详解

    /*——————————————————————————————————————————————————————————— [结果填空题]T1 题目:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小 ...

  5. flutter获取状态栏高度

    import 'dart:ui'; MediaQueryData.fromWindow(window).padding.top 系统默认的appBar等高度 位于Dart Packages/flutt ...

  6. POJ2385——Apple Catching

                                                $Apple~Catching$ Time Limit: 1000MS   Memory Limit: 6553 ...

  7. Conda常见命令

    Anaconda,Miniconda,Conda,Pip的区别: Anaconda:用于科学计算的python发行版,里面预装好了conda,某个版本的python,众多packages,科学计算工具 ...

  8. Java 获取指定日期范围内的每个月,每季度,每一年

    /**     *根据时间范围获得月份集     * @return     */    public static List<String> getRangeSet(String beg ...

  9. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  10. shutil、zipfile,tarfile

    shutil 模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作. 1. shutil.copyfileobj(fsrc, fdst[, length]) 功 ...