引言:面试是应付面试官,只有真正的掌握了原理,我们才能更好地着手与工作,提升自己的能力。
Spring Boot是一个基于Spring Framework的快速开发应用程序的框架。它提供了一种简单粗暴的方式来构建应用程序,开发人员只需要少量的配置即可快速的构建可运行的应用程序。然而,即使是Spring Boot的核心框架,也有很多可以让我们深入了解它如何工作的知识点。在这篇文章中,我们将深入研究Spring Boot的启动流程,并提供运行过程中的详细解释。
概述
在Spring Boot应用程序的启动过程中,一个类被认为是Spring Boot的入口点:org.springframework.boot.loader.Launcher
。(准确的说是PropertiesLauncher
类extends了Launcher
类,最先进入的是PropertiesLauncher
类)。Launcher
这个类的主要任务是设置ClassLoader
和加载应用程序的主类。在执行PropertiesLauncher
的main
方法之前,Spring Boot会执行一些准备工作,例如创建ClassLoader
和加载一些必需的类。接下来,我们将逐步了解Spring Boot在启动过程中的每个步骤。
创建ClassLoader
为了加载应用程序的类和资源,Spring Boot使用了一个自定义的ClassLoader:org.springframework.boot.loader.LaunchedURLClassLoader
。Spring Boot使用LaunchedURLClassLoader
替代了JDK提供的ClassLoader,这个ClassLoader可以加载来自多个JAR包和目录的类和资源。在Spring Boot启动流程的第一步中,它会执行以下代码创建LaunchedURLClassLoader
:
// PropertiesLauncher 的main方法,调用launch类launch方法
public static void main(String[] args) throws Exception {
PropertiesLauncher launcher = new PropertiesLauncher();
args = launcher.getArgs(args);
launcher.launch(args);
}
...
// Launcher类的launch方法
protected void launch(String[] args) throws Exception {
if (!isExploded()) {
JarFile.registerUrlProtocolHandler();
}
ClassLoader classLoader = createClassLoader(getClassPathArchivesIterator());
String jarMode = System.getProperty("jarmode");
String launchClass = (jarMode != null && !jarMode.isEmpty()) ? JAR_MODE_LAUNCHER : getMainClass();
launch(args, launchClass, classLoader);
}
...
protected Iterator<Archive> getClassPathArchivesIterator