我们平时使用springboot工程,可能会继承spring-boot-starter-parent,然后引入一个spring-boot-stater-web依赖,然后创建一个继承的启动类从SpringBootServletInitializer继续,然后添加@SpringBootApplication注解。一个初步的springboot项目搭建成功。但是在使用的过程中,我们也应该好奇它的java训练是如何进行的。今天我们就来探究下tomcat中springboot项目的启动顺序。在servlet2.5之前,我们使用web.xml配置servlet-context。结合spring的时候,我们不得不手动注册listener和mvcservlet,但是servlet3.0之后。我们的项目可以不用web.xml直接运行,因为3.0支持解配置。spring中启动类HandleType的处理类是org.springframework.web.WebApplicationInitizlizer,所以我们在编写启动类的时候,如果要在servlet环境下运行,就需要继承SpringBootServletInitializer,这样我们的项目才会开始运行用tomcat启动。下面研究一下SpringBootServletInitializer的启动过程。其实里面有个createRootApplicationContext方法。这个启动过程其实就是创建SpringApplication的过程。在此期间,Spring采用的构建器模式将复杂的创建过程变成了简单的对象创建过程,使得代码逻辑更加直观。SpringApplicationBuilder创建的SpringApplication流程第一步:创建一个初始的SpringApplication对象。SpringApplication创建时首先判断容器是否为Servlet环境,加载META-INF/spring.factories文件中的所有ApplicationContextInitializer.class和ApplicationListener.class信息并创建第二步:为容器创建环境,对象我们讲到可以收集系统环境变量第三步:为SpringApplication创建ServletContextApplicationContextInitializer,将SpringApplication绑定到ServletContext。第四步:确定SpringApplication中的ApplicationContext实现类,默认为注解驱动的AnnotationConfigEmbeddedWebApplicationContext.class的实现。第五步:回调启动类中的configure方法。我们可以在该方法中自定义自己的构建器处理逻辑,比如设置启动数据源source。第六步:完成组装,返回SpringApplication对象。在ApplicationContext的启动过程中,英语好的人都可以直接看懂大概的步骤,由此提醒我们在平时的业务中写代码时选择一个好的方法名的重要性。springApplication启动的大致步骤如下。图中省略了一些部分,但是无论从SpringApplication的创建还是ApplicationContext的运行阶段,都有大量的回调接口,体现了设计模式的开闭原则。其实目前为止我们用的最好的体验就是这个解配置和注解以及资源文件配置。后面我们会重点介绍spring注解加载是如何工作的~。
