详细解析springboot中run方法源码

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

run方法: 跟踪进入run: 会看到还是run方法,但将启动类作为参数传了进来,继续进入run方法: 看到new了一个springapplication对象,我们看看这个对象是干嘛的,进入该构造方法: 继续,跟踪this: 代码终于多了起来,首先,我们从对官方的文档注释可以解读到这个方法是干什么的:创建实例,并且spring上下文将从指定位置来加载这些bean, 里面有一个方法是deduceWebApplicationType,判断web应用的类型,进入此方法: 会看到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实例): 接着进入: 先拿到类的名字,在去使用反射的方式创建loader的实例,不明白的童鞋可以跟到createSpringFactoriesInstances()方法中瞄一瞄,因此,到底加载哪个类取决于loadFactoryNames()这个方法,我们跟进去瞄: 进入loadSpringFactories(): 首先一个空的集合,然后判断过后,就开始加载了,通过FACTORIES_RESOURCE_LOCATION来加载,我们看看这是什么: spring.factories文件,这是什么文件呢? 事实上,这个文件在spring里面配置在: 这一个jar包中,自动配置的jar包,我们打开,进入META-INF,会看到 有一个文件正是spring.factories文件,打开该文件: 会看到一堆的配置信息,其中EnableAutoConfiguration作为spring注解用来 开启自动配置,也是@springbootapplication中的一个子注解,那么我们就能够理解,一旦一个项目引用了@springbootapplication,为什么会开启那么多的配置,一旦autoconfigure.jar包被扫描到,并且org.springframework.boot.autoconfigure就在该jar包中,所有的配置类也在里面,所以说spring已经将以前你所需要配置的内容,使用java配置的方式帮你写好了, 你要做的,只是重写它写好的类,或者是通过application.yml文件来修改部分你想修改的数据即可,over~ 长城中的蚂蚁 2020.2.22

经验分享 程序员 微信小程序 职场和发展