您的位置:首页 > 运维架构 > Tomcat

Tomcat7.0.42源码研读之类加载器(五)

2017-11-05 20:14 274 查看
        Tomcat作为一款通用型的Web服务器,在类加载器上面应该要满足一下几点特性:

         1、资源隔离性:如果一个Tomcat实例下部署了多个Web应用,有的Web应用使用了Spring3,有的Web应用使用了Spring4,如果Tomcat使用一个类加载器加载,那么Tomcat很可能会因为Jar包冲突而无法启动。

         2、灵活性:如果一个Tomcat实例下部署了多个Web应用,我们更改其中一个应用的Jar包时,不会影响到其他Web应用

         3、性能:如果一个Tomcat实例下部署了多个Web应用,每个应用都有其专门的类加载器,类加载器只需要扫描自己的Jar包,速度更快

       基于上面几点,Tomcat的类加载器架构如下:

        


           Tomcat类加载器说明如下表:

            

类加载器说明
Common以System为父类加载器,Tomcat最顶层的公用类加载器,其路径为common.loader
Catalina以Common为父类加载器,用于加载 Tomcat服务器自身的类加载器,其路径为server.loader
Shared
以Common为父类加载器,是所有Web应用的父类加载器,其路径为shared.loader
Web应用
以Shared为父类加载器,加载/WEB-INF/classes/和/WEB-INF/lib下所有的class和Jar包,该类加载器只对当前Web应用可见,对其他的Web应用均不可见
     我们知道,Java默认的类加载机制是双亲委派模式的,类加载顺序是:

     1、交由父类加载器加载,这个是个向上递归的过程

     2、如果父类加载器没有,则从当前类加载器加载

     3、如果都没有加载到,则抛出异常

     但是Tomcat的Web应用类加载器跟Java默认的不太一样,它的加载顺序如下:

     1、先从JVM的Bootstrap类加载器进行加载

     2、如果没有,再从当前类加载器路径下进行加载(/WEB-INF/classes、/WEB-INF/lib)

     3、如果没有,再从父类加载器进行加载,由于父类加载器采用默认的双亲委派模式,加载顺序为System、Common、Shared

    Tomcat提供了delegate属性控制是否启用Java默认的双亲委派模式,默认是false(不启用),Tomcat也提供了packageTriggersDeny属性只让某些包路径采用Java的双亲委派模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: