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

  通过前面这么多讲解,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启动原理 源码上)

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

上一篇:tomcat启动时没有把spring配置文件定义的bean加载进来


下一篇:wireshark基础学习—第四部分wireshark过滤器总结