资讯专栏INFORMATION COLUMN

tocmat类加载:正统的类加载

RayKr / 1717人阅读

摘要:类加载模型为了支持这套目录结构,并对目录里面的类库进行加载和隔离,自定义了多个类加载器,这些类加载器按照经典的双亲委派模型来实现,如下图所示加载问题加载器的实现清晰易懂,并且采用了官方推荐的正统的使用类加载器的方式。

一个功能健全的Web服务器,要解决如下几个问题

部署在同一个服务器上的两个Web应用程序使用的Java类库可以实现相互隔离。不能要求一个类库在一个服务器中只有一份,服务器应当保证两个应用程序的类库可以互相独立使用。

部署在同一个服务器上的两个Web应用程序所使用的Java类库可以互相共享,如果Java类库不能共享使用,虚拟机的方法区很容易出现过度膨胀的风险,比如一台服务器上部署了10个使用Spring的程序。

服务器需要尽可能保证自身安全不受部署的Web应用程序影响。服务器所使用的类库应该与应用程序使用的类库互相独立。

支持JSP的服务器,大部分都需要支持HotSwap功能(热交换功能)

tomcat的lib目录结构

  Tomcat目录结构中,有三组目录(“/common/”,“/server/”和“shared/”)可以存放公用Java类库,此外还有第四组Web应用程序自身的目录“/WEB-INF/”,把java类库放置在这些目录中的含义分别是:

放置在common目录中:类库可被Tomcat和所有的Web应用程序共同使用。

放置在server目录中:类库可被Tomcat使用,但对所有的Web应用程序都不可见。

放置在shared目录中:类库可被所有的Web应用程序共同使用,但对Tomcat自己不可见。所有jar都合在lib包下

放置在/WebApp/WEB-INF目录中:类库仅仅可以被此Web应用程序使用,对Tomcat和其他Web应用程序都不可见。

注:tomcat 在6以后。废弃了/common目录,默认没有shared目录。

tomcat类加载模型

为了支持这套目录结构,并对目录里面的类库进行加载和隔离,Tomcat自定义了多个类加载器,这些类加载器按照经典的双亲委派模型来实现,如下图所示 :

Spring加载问题

Tomcat 加载器的实现清晰易懂,并且采用了官方推荐的“正统”的使用类加载器的方式。这时作者提一个问题:如果有 10 个 Web 应用程序都用到了spring的话,可以把Spring的jar包放到 common 或 shared 目录下让这些程序共享。Spring 的作用是管理每个web应用程序的bean,getBean时自然要能访问到应用程序的类,而用户的程序显然是放在 /WebApp/WEB-INF 目录中的(由 WebAppClassLoader 加载),那么在 CommonClassLoader 或 SharedClassLoader 中的 Spring 容器如何去加载并不在其加载范围的用户程序(/WebApp/WEB-INF/)中的Class呢?

spring加载解答

spring根本不会去管自己被放在哪里,它统统使用线程上下文加载器来加载类,而线程上下文加载器默认设置为了WebAppClassLoader,也就是说哪个WebApp应用调用了spring,spring就去取该应用自己的WebAppClassLoader来加载bean。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69572.html

相关文章

  • 摘记《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》

    摘要:第章内存区域与内存溢出异常运行时数据区域虚拟机在执行程序的过程中会把它所管理的内存划分为若干个不同的数据区域。即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。 第2章 Java内存区域与内存溢出异常 2.2 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。根据《Java虚拟机规范(Java SE 7版)...

    zoomdong 评论0 收藏0
  • 详细深入分析 Java ClassLoader 工作机制

    摘要:作用负责将加载到中审查每个类由谁加载父优先的等级加载机制将字节码重新解析成统一要求的对象格式类结构分析为了更好的理解类的加载机制,我们来深入研究一下和他的方法。就算两个是同一份字节码,如果被两个不同的实例所加载,也会认为它们是两个不同。 申明:本文首发于 详细深入分析 ClassLoader 工作机制 ,如有转载,注明原出处即可,谢谢配合。 什么是 ClassLoader ? 大家...

    mdluo 评论0 收藏0
  • Java反射-动态加载和重新加载

    摘要:示例如下动态类重新加载动态类重新加载有一些挑战。为了上面代码的正常运行,你当然需要实现自己的类加载器,让接口或超类由其父类加载。 Java中可以在运行时加载和重新加载类,虽然并不像我们想像中那么简单。本文将解释何时、怎样在Java中加载、重新加载类。你可以争论动态加载类是Java反射的一部分还是Java核心的一部分。不管怎样,我把它放在了Java反射中,因为没有更好的地方放置它。 类加...

    nodejh 评论0 收藏0
  • Java加载机制

    摘要:当前类加载器和所有父类加载器都无法加载该类时,抛出异常。加载两份相同的对象的情况和不属于父子类加载器关系,并且各自都加载了同一个类。类加载机制与接口当虚拟机初始化一个类时,不会初始化该类实现的接口。 类加载机制 概念 类加载器把class文件中的二进制数据读入到内存中,存放在方法区,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。 1、加载: 查...

    aaron 评论0 收藏0

发表评论

0条评论

RayKr

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<