返回

揭秘 SpringBoot java -jar 启动的秘密:自定义类加载器

见解分享

前言

作为一名 Java 开发人员,你一定对 SpringBoot 框架并不陌生。它以其简便的配置和强大的功能,深受开发者的喜爱。其中,java -jar 命令是启动 SpringBoot 应用最常用的方式之一。那么,你是否了解 java -jar 的启动原理呢?

缘起:面试官的提问

还记得那次面试,面试官突然问我:“你了解 SpringBoot java -jar 的启动原理吗?”当时的我,大脑一片空白,只记得他提到“自定义类加载器”这个词。事后,我赶紧恶补了相关知识,并走读了 SpringBoot 启动过程的源码。终于,我恍然大悟,明白了面试官的用意。

深入剖析:SpringBoot 的启动过程

SpringBoot 应用的启动过程,可以分为以下几个步骤:

  1. 加载 SpringBoot 启动类: 通过 java -jar 命令执行 SpringBoot 应用时,Java 虚拟机首先会加载 SpringBoot 启动类,如 com.example.demo.Application
  2. 创建 BootstrapClassLoader: SpringBoot 启动类加载完成后,会创建 BootstrapClassLoader。该类加载器用于加载 SpringBoot 框架的核心类库,如 spring-core、spring-context 等。
  3. 加载 SpringBoot 核心类库: BootstrapClassLoader 加载 SpringBoot 核心类库后,会将这些类库添加到 Java 虚拟机的类路径中。
  4. 创建 ApplicationContext: SpringBoot 启动类调用 SpringApplication.run() 方法启动应用。该方法会创建 SpringApplicationBuilder 对象,并使用 BootstrapClassLoader 加载 SpringBoot 的相关配置文件。然后,SpringApplicationBuilder 会构建 ApplicationContext,即 Spring 容器。
  5. 初始化 Spring 容器: ApplicationContext 创建完成后,会对 Spring 容器进行初始化。这包括扫描组件、装配 Bean、解析注解等操作。
  6. 启动 SpringBoot 应用: Spring 容器初始化完成后,SpringBoot 应用即可启动。应用会根据配置文件中的配置,启动 Web 服务器或其他服务。

自定义类加载器:JarLauncher 的作用

在 SpringBoot 的启动过程中,自定义类加载器 JarLauncher 发挥着重要作用。JarLauncher 是 SpringBoot 提供的一个类加载器,用于加载 SpringBoot 应用的 jar 包。它继承自 URLClassLoader,并重写了 findClass() 方法。在 findClass() 方法中,JarLauncher 会首先尝试从 jar 包中加载类,如果加载失败,再委托给父类加载器加载。

通过自定义类加载器 JarLauncher,SpringBoot 能够隔离 SpringBoot 应用的类和 Java 虚拟机的系统类。这可以防止 SpringBoot 应用中的类与系统类产生冲突,确保应用的稳定运行。

结语

通过本文,我们深入剖析了 SpringBoot java -jar 的启动原理,揭开了自定义类加载器的神秘面纱。从面试官的提问入手,我们逐步探索了 SpringBoot 启动过程的源码,理解了 Java 虚拟机的类路径机制,并揭示了 ClassLoader、JarLauncher、SpringApplication、SpringApplicationBuilder、BootstrapClassLoader 和 LocalContainerEntityManagerFactoryBean 等关键组件的作用。希望这些知识能够帮助你更好地理解 SpringBoot 的启动机制,并为你的开发实践提供帮助。