带着萌新看springboot源码11(springboot启动原理 源码上)

时间:2022-08-28 23:19:37

  通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些都说过了),然后通过Dao和数据库打交道(配置数据源、Druid监控都说了,其实我后面要写的就是springboot和mybatis、springdata jpa的整合运用了),顺便还说了一下spring中ioc容器的创建原理。

  今天就来一点更好玩的东西,大家还记得最开始的那个主配置类吧(就是有main方法的那个)。对了,ioc容器创建还有不了解的出门左转,可以看我前面几次写的文章。

  温馨提醒:这次原理涉及到ioc容器创建原理以及监听器原理,我会跳过,因为前几篇说过了,只说springboot有关的;而且不会使用调试的小伙伴要先学会调试哦~

  随便创建一个springboot应用(要包括web模块)

带着萌新看springboot源码11(springboot启动原理 源码上)

  首先,我们就在这里打个断点

带着萌新看springboot源码11(springboot启动原理 源码上)

  调试,run方法里面可以看到还是啥事没做,继续调用run方法,step into进入

带着萌新看springboot源码11(springboot启动原理 源码上)

  可以看到,先根据主配置类创建一个spring应用(SpringApplication),然后调用run方法

带着萌新看springboot源码11(springboot启动原理 源码上)

  

  我们看看是怎么创建spring应用的

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

  

  那我们来看看这两个类似的方法做了一些什么

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

  

  是累路径下所有的jar包下的META-INF/spring.factories文件,我只是举个例子,还有很多个这样的xxxInitializer

带着萌新看springboot源码11(springboot启动原理 源码上)

  同理,那两个类似的的方法下面一个,就是加载所有类路径下META-INF/spring.factories,键为ApplicationListener的所有类,然后保存起来。

  到这里。spring应用就创建出来了,无非是加载所有的ApplicationContextInitializer对应的xxxInitializer   和  ApplicationRunListener对应的监听器,都保存起来

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

  下面就开始运行run方法,看run方法里面是怎么运行的

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

  主要来看看这七个步骤是干了什么

第一步

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

  

  拿到所有监听器,创建对象,然后保存起来,再看第一步的start()方法,有关监听器的原理在我的spring ioc原理我就说了(这里的所有监听器,在之前已经加载好了,都存起来了)

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

第二步

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

  

  后面的就是监听器的原理了,都一样(贴一下监听器接口里面的方法)

带着萌新看springboot源码11(springboot启动原理 源码上)

第三步(创建ioc容器)

  带着萌新看springboot源码11(springboot启动原理 源码上)

第四步

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

  每个具体的xxxApplicationContextInitializer类的initialize()方法都不一样,可以自己去看看,估计肯定是设置一些参数,往ioc容器里导入一些组件

第五步(刷新容器,具体的我之前spring ioc源码那里详细的讲解了,这里就略过)

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

带着萌新看springboot源码11(springboot启动原理 源码上)

  记住哦,这里的获取ioc容器由于在上面已经创建过了,所以会直接从上面获取的

带着萌新看springboot源码11(springboot启动原理 源码上)

  先到这里,下一节继续说一下后面一点内容

带着萌新看springboot源码11(springboot启动原理 源码上)的更多相关文章

  1. 带着萌新看springboot源码03

    上一节讲到了快速新建一个springboot应用,以及springboot的自动配置类起作用的时机,并且一起看了一个自动配置类的源码. 这一节我们来粗略看看当用户在浏览器输入一个url,怎么样返回一个 ...

  2. 带着萌新看springboot源码12(启动原理 下)

    先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...

  3. 带着萌新看springboot源码07

    [修改]很长时间没看这个,有点弄混淆了.bean后置处理器(BeanPostProcessor)应该是在bean创建实例并且赋值好了之后,调用初始化方法(相当于xml配置中<bean init= ...

  4. 带着萌新看springboot源码

    springboot的功能确实强悍,只需要很少的配置,就能够做出来一个简单的web应用,下面我就简要的分析一下为什么springboot能够起作用. 不觉得很奇怪吗?只需要一个主配置类(就是启动那个m ...

  5. 带着萌新看springboot源码05

    上一节走了一遍从浏览器发出请求到得到向页面的流程,基本的功能是已经实现了.但是现在啊,我想自定义一个拦截器(拦截器可以做用户登录验证,如果登录了,就让你通过,如果没有登录,就重定向登录页面),这里就不 ...

  6. 带着萌新看springboot源码8(spring ioc源码上)

    emmm.....这次先不说springboot原理,先好好回顾一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易. 要说起spring,最重要的就是 ...

  7. 带着萌新看springboot源码10(springboot&plus;JdbcTemplate&plus;druid)

    上一节把springboot和jdbcTemplate大概用法说了一下,以及大概看了一下源码,还说了加载sql文件时的原理. 这一节来看看自动注入JdbcTemplate的原理,顺便用一用Druid数 ...

  8. 带着萌新看springboot源码09(springboot&plus;JdbcTemplate)

    emmm.....常规开局,继续说一下废话,前面简单的说了一下spring的ioc容器创建原理(花了不少时间去看了别人的博客+查了不少资料+自己的理解),相信大家对ioc容器有了一个初步的认识了. s ...

  9. 带着萌新看springboot源码8(spring ioc源码 完)

    上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...

随机推荐

  1. 数据结构《13》----二叉树 Morris 前序遍历

    三种二叉树的后序遍历的方法: 1. 递归                      O(n) 时间复杂度, O(n) 空间复杂度 2. 迭代(用栈)       O(n) 时间复杂度, O(n) 空间 ...

  2. PGA与SGA

    当用户进程连接到数据库并创建一个对应的会话时,Oracle服务进程会为这个用户专门设置一个PGA区,用来存储这个用户会话的相关内容.当这个用户会话终止时,数据库系统会自动释放这个PAG区所占用的内存. ...

  3. setfacl命令 来自&colon; http&colon;&sol;&sol;man&period;linuxde&period;net&sol;setfacl

    常用选项##### <pre>-b,--remove-all:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留. -k,--remove-default:删除缺省的 ...

  4. java详解final、多态、抽象类、接口原理

    1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...

  5. 安装和使用 memcached

    memcached 和 Grails,第 1 部分:安装和使用 memcached 学习 memcached 命令并评估缓存性能 本文是系列文章的第 1 部分,主要介绍 memcached 和 Gra ...

  6. 【学习笔记】Python基础教程学习笔记

    教程视频网盘共享:http://pan.baidu.com/s/1hrTrR5E 03-python基础.if判断 print 输出数据 print("hahahah")----- ...

  7. Oracle的静默安装 升级和卸载 参考规范

    Oracle的静默安装 升级和卸载 参考规范 20180912 V1 一.Oracle的安装 Oracle产品的三种安装方式分别为: 1.图形化(Java向导)安装引导 2.使用应答文件静默安装 3. ...

  8. 视频中的DTS与PTS的理解

    原文地址:http://blog.itpub.net/30004768/viewspace-1338882/  DTS(解码时间戳)和PTS(显示时间戳)分别是解码器进行解码和显示帧时相对于SCR(系 ...

  9. Android Hook 框架 Cydia&lowbar;substrate 详解

    目录(?)[-] 使用方法 短信监控实例 1.Cydia_Substrate 框架简介 Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(n ...

  10. perl HTML&colon;&colon;LinkExtor模块&lpar;1&rpar;

    use LWP::Simple; use HTML::LinkExtor; $html = get("http://www.baidu.com"); $link = HTML::L ...