SpringBoot项目启动过程源码终于整体捋了一遍(三)

上篇分析到了构造SpringApplication的过程,为了了解这个主源类primarySources,大致撸了一遍bean加载的过程。同时还遗留了一个问题,已经看到初始化SpringApplication的时候esourceLoader是为了拿类加载器,那如果resourceLoader为null怎么办呢,总不能不要类加载器吧,这篇带着这个问题继续看SpringApplication的初始化过程,还是先把构造方法先贴一下:

SpringBoot项目启动过程源码终于整体捋了一遍(三)

 继续往下看:

SpringBoot项目启动过程源码终于整体捋了一遍(三)

其实很多时候从方法名就可以知道这个方法的作用,deduceFromClasspath()这个方法一看就知道是从类路径中推断出应用类型,可以看一下这个方法:

SpringBoot项目启动过程源码终于整体捋了一遍(三)

可以这里分了三种应用类型 ,即reactive、none和service,判断条件里用了ClassUtils.isPresent()方法,至于这些常量参数其实就是一些类路径,可以看一下:

SpringBoot项目启动过程源码终于整体捋了一遍(三)

摆这些类路径是要干嘛,一副要加载它们的样子,那就继续看看这个ClassUtils.isPresent()方法:

SpringBoot项目启动过程源码终于整体捋了一遍(三)

看来关键在于这个forName()方法,意思是这个方法能没有异常的执行完那就返回true,那就看看这个forName():

 

SpringBoot项目启动过程源码终于整体捋了一遍(三)

 有时候大佬们写的注释得看一看,明明白白的告诉我们这个forName()方法可以替换Class.forName(),而且同样返回类的实例,厉害了,那以后岂不是可以用ClassUtils.forName()来加载类。

到这里就理清了是怎么推断应用类型了,说白了就是看哪些类可以被加载,再说白一点就是引入了哪些jar包。

本来想继续往下写的,但是接下来的内容值得专门一篇博,所以这篇就到这里,依然总结一下:这篇就走了一行代码,看了下初始化SpringApplication的过程中是怎么推断应用类型的,同时开头的问题仍然遗留着,即:初始化SpringApplication的时候esourceLoader为null怎么拿类加载器。