今天小乐来给大家分享一些关于springboot启动流程方面的知识吧,希望大家会喜欢哦

springboot事务配置 springboot启动流程springboot事务配置 springboot启动流程


springboot事务配置 springboot启动流程


springboot事务配置 springboot启动流程


1、SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本大大增加,需要先了解熟悉Spring原理。

2、如果还不清楚Spring原理的,可以先查看博主之前的文章,本篇主要分析SpringBoot的启动、自动配置、Condition、驱动原理。

3、SpringBoot启动非常简单,因其内置了Tomcat,所以只需要通过下面几种方式启动即可:可以看到种是简单的,也是常用的方式,需要注意类上面需要标注 @SpringBootApplication 注解,这是自动配置的核心实现,稍后分析,先来看看SpringBoot启动做了些什么?在往下之前,不妨先猜测一下,run方法中需要做什么?对比Spring源码,我们知道,Spring的启动都会创建一个 ApplicationContext 的应用上下文对象,并调用其refresh方法启动容器,SpringBoot只是Spring的一层壳,肯定也避免不了这样的作。

4、另一方面,以前通过Spring搭建的项目,都需要打成War包发布到Tomcat才行,而现在SpringBoot已经内置了Tomcat,只需要打成Jar包启动即可,所以在run方法中肯定也会创建对应的Tomcat对象并启动。

5、以上只是我们的猜想,下面就来验证,进入run方法:SpringBoot的启动流程就是这个方法,先看 getRunListeners 方法,这个方法就是去拿到所有的 SpringApplicationRunListener 实现类,这些类是用于SpringBoot发布的,关于驱动稍后分析,这里主要看这个方法的实现原理:一步步下去可以看到终就是通过SPI机制根据接口类型从 META-INF/spring.factories 文件中加载对应的实现类并实例化,SpringBoot的自动配置也是这样实现的。

6、为什么要这样做呢?通过注解扫描不可以么?当然不行,这些类都在第三方jar包中,注解扫描实现是很麻烦的,当然你也可以通过 @Import 注解导入,但是这种方式不适合扩展类特别多的情况,所以这里采用SPI的优点就显而易见了。

7、回到run方法中,可以看到调用了 createApplicationContext 方法,见名知意,这个就是去创建应用上下文对象:注意这里通过反射实例化了一个新的没见过的上下文对象 AnnotationConfigServletWebApplicationContext ,这个是SpringBoot扩展的,看看其构造方法:如果你有看过Spring注解驱动的实现原理,这两个对象肯定不会陌生,一个实支持注解解析的,另外一个是扫描包用的。

8、上下文创建好了,下一步自然就是调用refresh方法启动容器:这里首先会调用到其父类中 ServletWebApplicationContext :可以看到是直接委托给了父类:这个方法不会陌生吧,之前已经分析过了,这里不再赘述,至此SpringBoot的容器就启动了,但是Tomcat启动是在哪里呢?run方法中也没有看到。

9、实际上Tomcat的启动也是在refresh流程中,这个方法其中一步是调用了onRefresh方法,在Spring中这是一个没有实现的模板方法,而SpringBoot就通过这个方法完成了Tomcat的启动:这里首先拿到 TomcatServletWebFactory 对象,通过该对象再去创建和启动Tomcat:上面的每一步都可以对比Tomcat的配置文件,需要注意默认只支持了协议:如果想要扩展的话则可以对 additionalTomcatConnectors 属性设置值,需要注意这个属性没有对应的setter方法,只有 addAdditionalTomcatConnectors 方法,也就是说我们只能通过实现 BeanFactoryPostProcessor 接口的 tProcessBeanFactory 方法,而不能通过 BeanDefinitionRegistryPostProcessor 的 tProcessBeanDefinitionRegistry 方法,因为前者可以通过传入的BeanFactory对象提前获取到 TomcatServletWebFactory 对象调用 addAdditionalTomcatConnectors 即可;而后者只能拿到BeanDefinition对象,该对象只能通过setter方法设置值。

10、这段代码会在控制台打印所有的名称,按照顺序如下:以上是正常启动关闭,如果发生异常还有发布 ApplicationFailedEvent 。

11、的发布遍布在整个容器的启动关闭周期中,发布对象刚刚我们也看到了是通过SPI加载的 SpringApplicationRunListener 实现类 EventPublishingRunListener ,同样也是在 spring.factories 文件中配置的,默认实现了以下:可以看到有用于文件编码的( FileEncodingApplicationListener ),有加载日志框架的( LoggingApplicationListener ),还有加载配置的( ConfigFileApplicationListener )等等一系列,SpringBoot也就是通过这系列将必要的配置和组件加载到容器中来,这里不再详细分析,感兴趣的读者可以通过其实现的 onApplicationEvent 方法看到每个究竟是的哪一个,当然发布和我们自己也是可以扩展的。

12、SpringBoot核心的还是自动配置,为什么它能做到开箱即用,不再需要我们手动使用 @EnableXXX 等注解来开启?这一切的就在 @SpringBootApplication 注解中:这里重要的注解有三个: @SpringBootConfiguration 、 @EnableAutoConfiguration 、 @ComponentScan 。

13、 @ComponentScan 就不用再说了, @SpringBootConfiguration 等同于 @Configuration ,而 @EnableAutoConfiguration 就是开启自动配置:@AutoConfigurationPackage 注解的作用就是将该注解所标记类所在的包作为自动配置的包,简单看看就行,主要看 AutoConfigurationImportSelector ,这个就是实现自动配置的核心类,注意这个类是实现的 DeferredImportSelector 接口。

14、在这个类中有一个 selectImports 方法。

本文到这结束,希望上面文章对大家有所帮助。