iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >tomcat与类加载器的介绍
  • 416
分享到

tomcat与类加载器的介绍

2023-06-02 17:06:37 416人浏览 泡泡鱼
摘要

本篇内容介绍了“Tomcat与类加载器的介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!再次认识Tomcat  &nb

本篇内容介绍了“Tomcat与类加载器的介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

再次认识Tomcat

       Tomcat是我们从一开始接触JAVA WEB就认识的一个WEB服务器,它是由Java语言编写的,主要的文件夹就是bin,conf,lib,logs,webapps这5个文件夹

tomcat与类加载器的介绍

Bin,是我们启动,关闭tomcat的命令所在的文件夹

Conf,是我们tomcat相应配置所在的地方,在我们最早学习部署的时候,就有一种直接在conf中修改server.xml以及session过期时间之类的。

Lib,是tomcat所需依赖所在的文件夹,在之前5.x的版本中,并不直接是lib文件夹,而是分成了3个,common,server和shared三个文件夹,在下面我们来详细说一下这3个被移除掉的东西对于现在的我们还有什么意义。

Logs,是tomcat运行中的日志记录,当我们需要排查线上问题时,很多时候会需要通过查阅日志进行错误定位。

Webapps,这个我们应该是最熟悉的,因为我们部署项目都是扔到webapps里面然后启动tomcat

Tomcat的类加载器

Tomcat也是使用Java编写的一个web服务器,需要依赖Java环境,也就是说它的运行是需要基于JVM的,而用到JVM也就必然会使用类加载器来进行类加载。

Tomcat的类加载架构如下图所示

       tomcat与类加载器的介绍

       灰色背景的即我们之前提到过的JVM中原生的类加载器,分别负责的工作范围大家可以通过上一篇文章回顾。而往下我们可以看到有Conmmon,Catalina,Shared,WebApp,jsP这几种类加载器,在我们讲解每个类加载器的作用前,先说一下tomcat 5.x的架构,便于我们理解。

       在tomcat 5.x的时候,并不是一个lib包,而是common,server和shared这三个文件夹,按照双亲委托机制,不同的类加载器负责不同的范围,上图的Common类加载器负责/common/*,Catalina类加载器负责/server/*,Shared类加载器负责/shared/*,而WebAppClassLoader就是我们webapps文件夹下每个项目对应的类加载器了。

       /common/*中的类可以被tomcat和所有的web应用程序共同使用。

       /server/*中的类可以被tomcat使用,而对web应用程序不可见。

       /shared/*中的类可以被web应用程序共同使用,而对tomcat不可见。

看到这里,上面问的第三个问题,如果有10个SSM架构的项目,怎么节约内存。答案就是可以通过把SSM的jar包放到/shared/文件夹中,整个tomcat运行只有这一份,所有web项目共用它来实现。

那么问题又来了,现在没这些文件夹,只有一个lib包了,又该怎么办。

Lib包现在相当于是common,我们把jar包放到common中虽然可以达到效果,但感觉会很混乱,因为这里面有tomcat运行所必须的依赖。所以我们需要把shared用上。

我们打开conf/Catalina.properties文件,可以看到这么一个默认的配置。

tomcat与类加载器的介绍

其中common.loader已经有值了,而server.loader和shared.loader是没有值的。对应上面我们说到的3个文件夹,想必各位同学应该是知道这每项代表的意思了。

那么我们可以直接在tomcat中建立shared文件夹,将需要共享的jar包放到文件夹中,然后配置shared.loader的值为文件夹的路径,就可以用上了。

JSP

在我们开发过程中,如果使用的tomcat(或者其他一些主流的web服务器)和jsp的话,我们习惯于修改jsp之后直接切换到浏览器进行一次刷新,看改动是否生效,并不会去重启项目,这就和我们前面说到的JasperLoader相关了。

WebAppClassLoader是每个web项目有一个,如我们举例所说的10个项目,那么就有10个WebAppClassLoader,但JasperLoader就不止于此了。

我们有一个jsp文件,就有一个JasperLoader。

为什么需要这么多?

我们的JSP,大家都知道本质上是个Servlet,也就是以字节码文件的形式存在。在JSP文件被编译后,我们会得到一个同名_jsp.class文件,然后被类加载器加载到JVM中使用。当服务器检测到JSP被修改后,会替换掉该JSP当前的JasperLoader实例,然后当再次访问到这个JSP页面时,触发它的编译和类加载操作,此时就会再次创建一个JasperLoader用来加载JSP编译得出的字节码文件。

双亲委托机制的破坏

双亲委托机制并不是强制的要求,只是作为一种推荐的方式,在面对一些特殊的情况下,可能需要破坏这种机制。

这里所说的破坏并不见的是一种贬义的行为,换成突破二字可能会更好。

双亲委托机制存在一种缺陷,基础类加载器只能加载自己指定范围内的类,对于用户提供的类是没法加载的,以至于如果基础类需要用到用户类,那就无法加载。比如JDBC,我们都知道这是Java提供了一个规范,由不同的厂商去实现,这个规范通过接口体现,作为基础类,而厂商的实现是驱动包,放在我们项目的依赖包中。

我们可以使用DriverManager.getConnection(url,user,passWord)直接去获取连接,而不手动去做贾琏欲执事中的第一步,使用Class.forName()去加载驱动。这样一来,DriverClassLoader会自动去寻找并加载驱动。如果严格按照双亲委托机制,DriverManager是java.sql包中的,属于BootStrapClassLoader的范围,它只能看到这个文件夹中的类,而我们的驱动包是不在这里面的,就无法找到类,也就没法去加载了。那实际是怎么处理的呢?

tomcat与类加载器的介绍

我们可以看到这是getConnection重载的方法,我们直接传入URL,user和password实际就是重载的这个方法。在这里我们可以看到获取了调用者的类加载器,并且判断了callerCL为null。同学们想一下,会有类没有类加载器吗?为null并不是说它没有类加载器,而是因为它的类加载器是BootStrapClassLoader,这是由c++语言写的,无法用Java对象表示。好,既然知道你是BootStrapClassLoader加载的了,那我就给你替换掉,替换成当前线程的线程上下文类加载器。这个类是在线程创建的时候,从父线程继承或者默认直接取ApplicationClassLoader。换成ApplicationClassLoader了,那我们项目依赖的驱动包是不是也就很轻松的可以扫描并加载了?当然,如果你本身调用者所属的类加载器就是Application Class Loader那都不用去线程中取了。

“tomcat与类加载器的介绍”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: tomcat与类加载器的介绍

本文链接: https://www.lsjlt.com/news/230902.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • tomcat与类加载器的介绍
    本篇内容介绍了“tomcat与类加载器的介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!再次认识Tomcat  &nb...
    99+
    2023-06-02
  • Java类加载过程与类加载器详细介绍
    目录1. 类加载过程加载链接初始化2. 类加载器启动类加载器扩展类加载器应用类加载器自定义类加载器双亲委派模型1. 类加载过程 加载 通过类的全限定名(包名 + 类名),获取到类的...
    99+
    2022-11-13
    Java 类加载过程 Java加载器
  • Java 类加载机制详细介绍
    一、类加载器  类加载器(ClassLoader),顾名思义,即加载类的东西。在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加...
    99+
    2023-05-31
    java 加载机制
  • 【Java系列】Java虚拟机—类加载器介绍
    什么是Java虚拟机  Java虚拟机(Java Virtual Machine,JVM)是一个能够执行 Java 字节码的虚拟计算机。它是 Java 技术的核心部分,是 Java 应用程序运行的基础。 Java 程序在编译后会...
    99+
    2023-09-01
    java 开发语言 原力计划
  • Hibernate集合类型的延迟加载特性介绍
    本篇内容主要讲解“Hibernate集合类型的延迟加载特性介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Hibernate集合类型的延迟加载特性介绍”吧!Hibernate集合类型的延迟加载...
    99+
    2023-06-17
  • JVM入门之类加载与字节码技术(类加载与类的加载器)
    目录1. 类加载阶段1.1 加载阶段1.2 链接阶段准备1.3 初始化阶段1.4 练习2. 类加载器2.1 启动类加载器2.2 扩展类加载器2.3 双亲委派模式2.4 线程上下文类加...
    99+
    2024-04-02
  • Tomcat类加载器的工作原理是什么
    Tomcat类加载器的工作原理是通过使用Java类加载器来加载Web应用程序的类。Tomcat使用了一种层次结构的类加载器体系,每个...
    99+
    2024-04-02
  • C++的类与C#的类详细介绍
    本篇内容介绍了“C++的类与C#的类详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!许多编程人员学习C++总结经验为,有的觉得C++语...
    99+
    2023-06-17
  • tomcat类加载机制是什么
    Tomcat的类加载机制是指Tomcat服务器在运行过程中,如何加载和管理Java类文件的过程。它主要包括以下几个步骤:1. Boo...
    99+
    2023-09-15
    tomcat
  • Mycat的负载均衡类型介绍
    事务内的SQL,默认走写节点,以注释开头,则会根据balance=“1”或“2”去获取 b. 非事务内的SQL,开启读写分离默认根据balance=“1”或“2”去获取,以注释开头则会走写解决部分已经开启读...
    99+
    2024-04-02
  • JVM类加载机制及生命周期的详细介绍
    这篇文章主要讲解了“JVM类加载机制及生命周期的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JVM类加载机制及生命周期的详细介绍”吧!一.目标:什么是类的加载?类的生命周期?类加载...
    99+
    2023-06-02
  • Mybatis中mapper.xml实现热加载介绍
    目录背景目的实现方式总结背景 有些需求可能更新sql的频率较高,但又不想频繁发布java应用程序,所以mybatis-mapper.xml热加载的需求顺势而出。 目的 只需调起加载m...
    99+
    2024-04-02
  • Androidwebview加载H5方法详细介绍
    目录1,安卓APP 怎么用webview加载H52,H5怎么调用安卓定义的方法3,安卓怎么调用H5定义的方法这篇文章主要阐述3个知识点 安卓APP 怎么用webview加载H5H5怎...
    99+
    2024-04-02
  • 一篇文章讲透Tomcat的类加载机制
    目录-     前言     --     JVM 类加载器&...
    99+
    2024-04-02
  • Java对象与Java类的详细介绍
    本篇内容介绍了“Java对象与Java类的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录面向对象是什么Java类什么是类Java...
    99+
    2023-06-20
  • Tomcat的类加载机制流程及源码解析
    目录前言1、Tomcat 的类加载器结构图:2、Tomcat 的类加载流程说明:3、源码解析:4、为什么tomcat要实现自己的类加载机制:前言 在前面 Java虚拟机:对象创建过程...
    99+
    2024-04-02
  • Java tomcat中的类加载器和安全机制你了解吗
    目录类加载器双亲委派URLClassLoaderTomcat中类加载器架构安全机制总结类加载器 java中的类并不是一次加载完成的,而是按需加载。类加载器是用于加载java类到jav...
    99+
    2024-04-02
  • PythonGUI程序类写法与Label介绍
    目录经典的GUI程序类的写法Label 的介绍GUI应用程序类的经典写法 — 面向对象 通过类Application组织整个GUI程序,类Application继承了Fr...
    99+
    2024-04-02
  • C++Cartographer加载配置文件过程介绍
    在node_main.cc文件中,有如下代码 std::tie(node_options, trajectory_options) = LoadOptions(FLA...
    99+
    2023-03-19
    C++ Cartographer加载配置文件 C++ Cartographer
  • Java接口的继承与抽象类介绍
    这篇文章主要讲解了“Java接口的继承与抽象类介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java接口的继承与抽象类介绍”吧!在实施接口中,我们利用interface语法,将inter...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作