`

J2SE与Tomcat的类加载器

阅读更多

    类加载器是一切Java应用的基础,在JVM中提供了3个类加载器,他们以一种父子树的方式创建,同时使用委派模式确保应用程序可通过自身的类加载器(System)加载所有可见的Java类。

    委派模式过程如下

    1、从缓存中加载

    2、如果缓存中没有,则从父类加载器中加载

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

    4、如果没有,则抛异常

    我们先看看J2SE提供的三个类加载,具体结构图在最下方:

    J2SE标准类加载

    1、Bootstrap:用于加载JVM提供的基础运行类,即位于jre/lib目录下的核心类库。

    2、Extension:Java提供的一个标准的可扩展机制用于加载除核心类库外的Jar包,即只要复制到指定的扩展目录(可以多个)下的Jar,JVM会自动加载(不需要通过 -classpath指定)。默认的扩展目录是jre/lib/ext。典型的应用场景就是,Java使用该类加载器加载Jvm默认提供的但是不属于核心类库的jar,如JCE等。不推荐将应用程序依赖的类库放置到扩展目录下,因为该目录下的类库对所有基于该JVM运行的应用程序可见。

    3、System:用于加载环境变量CLASSPATH(不推荐使用)指定目录下的或者-Classpath运行参数指定的Jar包,System类加载器通常用于加载应用程序Jar包及其启动入口类(Tomcat的Bootstrap类即由System类加载器加载)

    在Java应用程序中,应用程序在不自己构造类加载器的情况下,使用System作为默认的类加载器,如果应用程序自己构造类加载,基本也是以System作为父类加载器。

    我们看完了J2Se提供的类加载器,下面看看Tomcat中扩展的类加载器,Tomcat扩展的类加载器结构图也在最下面的图中。从图中我们可以看到,除了每个web应用的类加载器除外,Tomcat也提供了3个基础的类加载器和web应用加载器,而且这3个类加载器指向的路径和包列表均可以由catalina.properties配置。

    Tomcat类加载器

    1、Common:以System为父类加载器,是位于Tomcat应用服务器顶层的公用类加载器。负责加载Tomcat应用服务器内部和web应用均可见的类,例如Servlet规范相关包和一些通用的工具包。其路径为common.loader,默认指向$CATALINA_HOME/lib下的包。

    2、Catalina:以Common为父加载器,是用于加载Tomcat应用服务器的类加载器,负责加载只有Tomcat应用服务器内部可见的类,这些类对web应用不可见,如Tomcat的具体实现类,因为我们的web应用最好和服务器解耦,所以不应该依赖应用服务器的内部类。其路径为server.loader,默认为空,此时Tomcat使用Common类加载器加载应用程序。

    3、shared:以Common为父加载器,是所有web应用的类加载器,负责加载web应用共享的类,这些类Tomcat服务器不会依赖。其路径为shared.loader,默认为空,此时Tomcat使用Common类加载器加载应用程序。

    4、Web应用:以Shared为父类加载器,加载/WEB-INF/classes目录下的未压缩的Class和资源文件以及/WEB-INF/lib目录下的jar包,该类加载器只对当前Web应用可见,对其他Web应用均不可见。

    在tomcat默认情况下,这3个基础类加载器是同一个,但是我们可以通过配置创建3个不同的类加载器,是他们各司其职。举个例子:如果我们想实现自己的会话存储方案,而且该方案依赖了一些第三方包,我们不希望这些包对web应用可见,此时我们可以配置server.loader,创建独立的Catalina类加载器。

    接下来,我们从架构层面讨论一下Tomcat的类加载器方案:

    1、共享:Tomcat通过Common类加载器实现了jar包在应用服务器以及web应用之间共享,通过shared类加载器实现了jar包在web应用之间的共享,通过Catalina类加载器,加载服务器依赖的类,这样最大程度上实现了jar包的共享,而且又确保了不会引入过多无用的包。

    2、隔离性:这里的隔离性区别与前者,指服务器与web应用隔离,理论上,除去Servlet规范定义的接口外,我们的web应用不应依赖服务器的任何实现类,这样才有助于web应用的可移植性

 



 

 

 

 

  • 大小: 48.1 KB
1
0
分享到:
评论

相关推荐

    j2se模拟tomcat

    这个例子是用j2se的Socket和线程的技术来简单的模拟tomcat的执行过程,虽然没有tomact复杂但是原理都是一样的,理解了它再去理解tomcat的执行过程就会比较轻松了

    类加载器文件

    JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。 SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。

    J2SE_API J2SE_API

    J2SE_API、J2SE_API、J2SE_API、J2SE_API、J2SE_API、J2SE_API、J2SE_API

    J2SE基础知识大全

    J2SE基础知识大全 J2SE基础知识大全 J2SE基础知识大全

    com.google.zxing.client.j2se.jar下载

    zxing/zxing-j2se-1.7.jar包...包含类 com.google.zxing.StringsResourceTranslator.class com.google.zxing.client.j2se.BufferedImageLuminanceSource.class com.google.zxing.client.j2se.CommandLineRunner.class ...

    J2SE基础源代码

    J2SE基础源代码

    J2SE课件J2SE课件

    J2SE课件J2SE课件J2SE课件J2SE课件J2SE课件J2SE课件

    j2se1.5中文api

    j2se1.5中文api

    j2se doc 中文版

    j2se doc 中文版 j2se doc 中文版 j2se doc 中文版 j2se doc 中文版

    j2se5.0_API

    很好的j2se的API

    J2SE桌面应用开发

    J2SE桌面应用开发 J2SE桌面应用开发J2SE桌面应用开发 J2SE桌面应用开发 J2SE桌面应用开发

    j2se api 中文版

    j2se api 中文版 j2se api 中文版 j2se api 中文版

    J2EE与J2SE路径获取

    J2EE与J2SE项目中路径获取的几种方式

    J2SE图像处理

    关于J2SE图像处理的例子,对图像进行打开、尺度变换、旋转90、180、360度、进行灰处理。

    J2SE 教程

    J2SE 教程

    学习j2se的30个问题

    j2se的特征:如Applet和servlet的区别;多线程,重载,多态,扩展类,抽象类,接口问题,静态绑定与动态的区别等等

    J2SE.rar_J2SE在线查询_j2se chm

    包含J2SE的所有类,十分方便查询。而且是中文的哦!

    j2me实现类似j2se中类Properties

    sun从J2ME中去除了J2SE中的Properties相关类,所以J2ME不能直接使用现成自带的包实现Properties的相关功能,这里将介绍如何在J2ME中实现类似于J2SE中的类Properties的功能!本文包含了详尽的说明加代码!

    j2SE中文API帮助文档

    j2se中文API,详细介绍基础的类以及方法

    学好j2se的标准

    j2se是学好java的基础,其中必须掌握api文档的一些包

Global site tag (gtag.js) - Google Analytics