Java开发框架Spring源码分析

我们平时使用springboot项目,可能就是继承spring-boot-starter-parent,然后引入一个spring-boot-stater-web依赖,然后创建一个继承于SpringBootServletInitializer启动类继续,然后添上@SpringBootApplication注解。一个初略的springboot项目就搭建成功了。

但是我们在使用的过程中,应该也会好奇它java培训是怎么运作的,今天我们就来探究下,springboot项目在tomcat中的启动顺序。

在servlet 2.5之前我们都是使用的web.xml配置一个servlet-context,联合spring的时候,我们要手动注册监听器,还要注册mvcservlet,但是servlet 3.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信息并创建

第二步:为容器创建environment,我们之间讲述的那个能够收集系统环境变量的对象

第三步:为SpringApplication创建ServletContextApplicationContextInitializer,用来把SpringApplication绑定到ServletContext中。

第四步:确定SpringApplication中的ApplicationContext实现类,默认为注解驱动的AnnotationConfigEmbeddedWebApplicationContext.class的实现。

第五步:回调启动类中的configure方法,我们可以在这个方法里面自定义我们自己的构builder处理逻辑,比如设置启动数据源source。

第六步:完成装配,返回SpringApplication对象。

ApplicationContext的启动过程

其实只要英语好点的人,都能直接读出这其中的大抵的步骤,所以这个提醒我们,在自己平时业务中编写代码的时候,取一个好的方法名字的重要性。

springApplication启动的大致步骤如下。

图片中有些部分有所省略,但是无论从SpringApplication的创建,还是ApplicationContext的运行阶段,都有大量的回调接口,设计模式的开闭原则体现。

我们用到现在其实体验最好的就是这个去配置化以及注解和资源文件配置,后面我们再重点研究下spring的注解加载是怎么运作的~。

(0)

相关推荐