1.服务器启动时要先创建每一个jar包里面的ServletContainerIntialize实例,提前说下这个ServletContainerIntializer(接口)的创建是通过反射的,因此我们得获取它的实现类的全类名
2.jar包中的/META-INF/services文件夹下有一个javax.servlet.ServletContannerIntialize的文件,文件的内容就是列举了ServletContainerIntializer全部实现类的类名
3.HandlesYTypes方法能够在项目启动的时候加载我们指定的类,这个跟添加对象到spring容器不同,这个注解的作用等下就体现了
前面4步的解释:
1.启动tomcat
2.创建springServletContannerInitialize实例,我们看到这个类的代码,如图:
3.在springServletContannerInitialize类中有一个onStartUp方法,这个方法拿到了所有的WebApplicationInitialize的class对象,并创建他们各自的实例
4.接着每个WebApplicationInitialize实例会调用他们自己的onStartUp方法。
-------------------------------------分割线
5.6步的解释:
1.我们有一个疑问加载所有的WebApplicationInitialize,并调用他们的onstart方法有什么用呢?
2.我们可以点进去看它的代码和继承关系,如图:
3.核心就在于SpringBootServletInitializer的onStartUp方法,这个方法中有个createRootApplicationContext()来创建根容器,我们点进去这个发现它第一步先创建了一个springApplicationBuilber的构建器,并调用SpringBootServletInitializer的configurer方法,把构建器当作参数传入进去,没错,这里调用的configurer正是子类的configurer,这样构建器就拿到了springboot的主程序类并返回,接着就调用构建器的build()创建springboot应用,后面并执行了springboot应用的run方法,把springboot项目启动起来了