详细解析springboot中run方法源码

武汉新型冠状肺炎疫情期间,哪都去不了,宅在家中,泡杯热咖啡,研究着springboot框架,话不多说,先跟踪代码,上图!

run方法:
详细解析springboot中run方法源码
跟踪进入run:
详细解析springboot中run方法源码
会看到还是run方法,但将启动类作为参数传了进来,继续进入run方法:
详细解析springboot中run方法源码
看到new了一个springapplication对象,我们看看这个对象是干嘛的,进入该构造方法:
详细解析springboot中run方法源码
继续,跟踪this:
详细解析springboot中run方法源码
代码终于多了起来,首先,我们从对官方的文档注释可以解读到这个方法是干什么的:创建实例,并且spring上下文将从指定位置来加载这些bean,
里面有一个方法是deduceWebApplicationType,判断web应用的类型,进入此方法:
详细解析springboot中run方法源码
会看到spring做了一系列的判断,返回三种枚举类型的结果,分别是
REACTIVE(响应式Web),NONE(不是Web),SERVLET(普通Web),为什么spring要做这样的判断呢?我们在此埋一个伏笔,先看return WebApplicationType.REACTIVE,的判断条件,其中ClassUtils.isPresent()方法
用来判断提供类名的类是否存在,并且是否可以被加载
此方法的意思是:
如果该应用存在org.springframework.web.reactive.DispatcherHandler这个类,则表示是一个响应式web应用,需要去加载启动内嵌的响应式web服务器
如果该应用中不存在javax.servlet.Servlet或者 org.springframework.web.context.ConfigurableWebApplicationContext
中的其中一个,则不是web应用,无需加载启动内嵌的web服务器
否则,是一个普通的servlet的web应用,启动时需要加载启动内嵌的servlet的web服务器(比如Tomcat)
这个方法讲完后,我们返回到上一个构造方法SpringApplication()中,
进入getSpringFactoriesInstances()方法查看(该方法获取springFactories实例):
详细解析springboot中run方法源码
接着进入:
详细解析springboot中run方法源码
先拿到类的名字,在去使用反射的方式创建loader的实例,不明白的童鞋可以跟到createSpringFactoriesInstances()方法中瞄一瞄,因此,到底加载哪个类取决于loadFactoryNames()这个方法,我们跟进去瞄:
详细解析springboot中run方法源码
进入loadSpringFactories():
详细解析springboot中run方法源码
首先一个空的集合,然后判断过后,就开始加载了,通过FACTORIES_RESOURCE_LOCATION来加载,我们看看这是什么:
详细解析springboot中run方法源码
spring.factories文件,这是什么文件呢?
事实上,这个文件在spring里面配置在:
详细解析springboot中run方法源码
这一个jar包中,自动配置的jar包,我们打开,进入META-INF,会看到
有一个文件正是spring.factories文件,打开该文件:
详细解析springboot中run方法源码
会看到一堆的配置信息,其中EnableAutoConfiguration作为spring注解用来
开启自动配置,也是@springbootapplication中的一个子注解,那么我们就能够理解,一旦一个项目引用了@springbootapplication,为什么会开启那么多的配置,一旦autoconfigure.jar包被扫描到,并且org.springframework.boot.autoconfigure就在该jar包中,所有的配置类也在里面,所以说spring已经将以前你所需要配置的内容,使用java配置的方式帮你写好了,
你要做的,只是重写它写好的类,或者是通过application.yml文件来修改部分你想修改的数据即可,over~
长城中的蚂蚁
2020.2.22