自学内容网 自学内容网

在 Spring Boot 中,内置的 Tomcat 使用的是标准的 Java 类加载机制,而不是传统的 WebappClassLoader

在 Spring Boot 中,内置的 Tomcat 使用的是标准的 Java 类加载机制,而不是传统的 WebappClassLoader。具体来说,Spring Boot 默认使用的是应用类加载器 (AppClassLoader),而不是像在传统的 Java EE 环境中使用的 WebappClassLoader。这是因为 Spring Boot 通过嵌入的方式运行 Tomcat,而不是将应用部署到外部的 Tomcat 容器中。

传统的 WebAppClassLoader

在传统的 Java EE 应用中,当你将一个应用程序部署到一个独立运行的 Tomcat 容器时,Tomcat 会为每个 Web 应用创建一个 WebappClassLoader。这个类加载器专门用于加载应用程序的 classes 和 libraries。

Spring Boot 的 AppClassLoader

Spring Boot 采用嵌入式 Tomcat 的方式运行,即 Tomcat 作为应用的一部分被启动。这意味着类加载器的管理与传统的 Java EE 容器有所不同。在这种模式下,Spring Boot 应用使用的是应用类加载器 AppClassLoader 来加载应用内的类和资源。

示例代码

下面是一个简单的 Spring Boot 应用,展示如何检验 Spring Boot 内置的 Tomcat 使用的类加载器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.servlet.ServletContext;

@SpringBootApplication
public class ClassLoaderDemoApplication implements CommandLineRunner {

    @Autowired
    private ServletContext servletContext;

    public static void main(String[] args) {
        SpringApplication.run(ClassLoaderDemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        System.out.println("ClassLoader: " + classLoader);
        
        if (servletContext != null) {
            System.out.println("Servlet Context Class Loader: " + servletContext.getClassLoader());
        }
    }
}

运行输出

当你运行上述代码时,你预计会看到类似以下的输出:

ClassLoader: jdk.internal.loader.ClassLoaders$AppClassLoader@<hashcode>
Servlet Context Class Loader: jdk.internal.loader.ClassLoaders$AppClassLoader@<hashcode>

可以看到,类加载器是 AppClassLoader,而不是 WebappClassLoader。这验证了在 Spring Boot 中使用的是标准的 AppClassLoader

原因分析

当你使用 Spring Boot 的嵌入式 Tomcat 时,整个应用程序,包括 Tomcat 服务器和你的应用,都在同一个 JVM 进程中运行,没有传统分离的 Web 应用上下文的概念。因此,Spring Boot 直接使用应用类加载器 (AppClassLoader) 来加载所有的类和资源。相比于传统的 WebappClassLoader,这简化了类加载流程,也避免了一些类加载器冲突问题。

总结

  • Spring Boot 内置的 Tomcat 使用的是应用类加载器 (AppClassLoader),而不是传统的 Web 应用程序类加载器 (WebappClassLoader)。
  • 这是因为 Spring Boot 采用嵌入式 Tomcat 的运行方式,使得整个应用在单一的 JVM 进程中运行。
  • 使用 AppClassLoader 简化了类加载流程,也更适合 Spring Boot 的设计哲学。

原文地址:https://blog.csdn.net/wen262856298/article/details/143502554

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!