`
dicmo
  • 浏览: 68331 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Coder 爱翻译 How Tomcat Works 第八章 第一部分

    博客分类:
  • j2ee
阅读更多
Chapter 8: Loader

在前几章你有一个简单的加载器实现,它用来加载servlet类。本章讲解标准web应用加载器。一个serlvet容器需要一个定制的加载器,它不能简单地使用系统类加载器,因为它不能确定servlet正在运行情况。如果它打算加载所有的servlet和其它需要的类,servlet通过系统类加载器,然后一个servlet应该可以访问运行在JVM中CLASSPATH环境变量下的任何类和类库。这样就会出现安全问题。一个servlet只允许加载在WEB-INF/classes目录和它子目录下的类和部署在WEV-INF/ilb目录下的类。这就是为什么一个servlet容器需要有它自己的加载器。在servlet容器里的每一个web应用程序有自己的加载器。一个加载器应用某种规则来加载类。在Catalina里,一个加载器由org.apache.catalina.Loader接口代表。

另外一个Tomcat需要它自己的加载器的原因是:支持在一个在WEB-INF/classes和WEB-INF/lib下的类被改变时可以动态重新部署。在Tomcat中的类加载器的实现使用一个独立的线程来检查servlet和类文件的时间戳。要支持动态重新加载,一个类加载器必须实现org.apache.catalina.loader.Reloader接口。

本章第一部分简单回顾java中的类加载机制。接下来讲述所有加载器都必须实现的Loader接口。本章的应用程序也演示了Tomcat怎么使用它的加载器。

本章的两项扩展:repository 和resources。一个repository是类加载器将要搜索的地方。Resources参考一个类中的DirContext对象,DirContext对象的文档库(document base)指向context的文档库。

Java Class Loader

每次你创建一个java类的实例,类首先会被加载到内存。JVM使用一个类加载器来加载类。通常是类加载器搜索一个核心java类库和包含在CLASSPATH环境变量的所有目录。如果没有发现所需要的类。它将抛出一个java.lang.ClassNotFoundException异常。

从J2SE1.2起,JVM有三个类加载器:bootstrap class loader,(自启动类加载器) extension class loader,(扩展类加载器)和system class loader(系统类加载器)。三个类加载器中相互存在父子关系:自启动类加载器位于层次结构的最高层,而系统类加载器位于最底层。

自启动类加载器由JVM使用。当你使用java.exe程序时,它就开始工作。这样,它必须使用native code来实现。因为它用来加载JVM所需要的类。它也负责加载所有的核心java类,像:java.lang 和java.io包下的类。自启动类加载器搜索核心类库,像:rt.jar, i18n.jar等。
这些类库的搜索依赖于JVM的版本和操作系统。

扩展类加载器负责加载在标准扩展目录下的类。这样使程序员的操作变得更加容易,因为你只需要把JAR文件按复制到扩展目录下就可以了,这些jar文件就会被自动地搜索。扩展类库在不同的供应商之间是有区别的。Sun的JVM的标准扩展目录是/jdk/jre/lib/ext。
系统类加载器是默认的类加载器,它搜索CLASSPATH环境变量下的目录和JAR文件。

但是,JVM使用哪个类加载器呢?使用角色委托模式,这样会更安全。每次加载一个类,系统类加载器首先会被调用。但是它不会马上加载这个类。它那这个加载任务委派给它的父类加载器,扩展类加载器。而扩展类加载器也把这个任务委派给它的父类加载器,自启动类加载器。自启动类加载器总是给加载一个类的第一次机会来加载它。如果自启动类加载器不能找到需要的类,扩展类加载器就试图去加载这个类。如果扩展类加载器也加载失败,系统类加载器就接手这个加载任务。如果最后系统类加载器也不能找到这个类,就会抛出java.lang.ClassNotFoundException异常。为什么需要以这样的来回方式的加载一个类?

角色委托模式对安全控制十分重要。你可以使用安全管理器来限制访问某一个目录。一些有恶意企图的人可以写一个叫做java.lang.Object的类,它就可以用来访问你在硬盘上的任何目录。因为JVM信任这个java.lang.Object类,所以它不会监控它的活动。结果,如果这个java.lang.Object允许加载,安全管理器很容易被麻痹,这个类就会蒙混过关。幸运的是,因为角色委托模式的存在,这种情况就不会发生。

当一个特殊的java.lang.Object类在程序的某个地方被调用。系统类加载器把这个请求委派给扩展类加载器,然后扩展类加载器委派给自启动类加载器。自启动类加载器搜索它的核心类库,找到标准java.lang.Object,然后实例化它。结果,这个特殊的java.lang.Object将永远不会被加载。

Java中的类加载机制允许你可以通过继承抽象类java.lang.ClassLoader来写自己的类加载器。Tomcat需要一个定制的类加载器的原因就是:

 To specify certain rules in loading classes. 明确某种加载类的规则
 To cache the previously loaded classes. 缓存一个之前加载过的类
 To pre-load classes so they are ready to use. 预加载一个我们将要使用的类
2
0
分享到:
评论
3 楼 dicmo 2010-12-07  
he_wen 写道
兄弟你的速度怎么与我的是同步的。。。

有疑问?我一个月前看是看这本书的。然后有时间理解后接顺带翻译下
2 楼 he_wen 2010-12-07  
兄弟你的速度怎么与我的是同步的。。。
1 楼 mozhengxin 2010-12-07  
不错 继续翻译完吧!

相关推荐

    tomcat原理解析书(how-tomcat-works)中文版

    适合读者 1.jsp/servlet 开发人员,想了解 tomcat 内部机制的 coder; 2.想加入 tomcat 开发团队的 coder; 3.web 开发人员,但对软件开发很有兴趣的 coder; 4.想要对 tomcat 进行定制的 coder。

    Bad Programming Practices 101 Become a Better Coder by Learning How (Not) epub

    Bad Programming Practices 101 Become a Better Coder by Learning How (Not) to Program 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书

    phpcoder.rar

    PHPCoder是一款专为PHP开发者设计的高效代码编辑器,旨在提供一个轻量级且功能丰富的开发平台。这款软件以其便捷性、易用性和强大的功能深受程序员喜爱。在本篇文章中,我们将深入探讨PHPCoder的各项特性、安装过程...

    MediaCoder答题器

    6. 插件扩展:MediaCoder有一个开放的插件架构,用户可以通过安装第三方插件来增加新的编码解码器、滤镜和其他功能,扩展其应用范围。 7. 用户友好:MediaCoder的界面简洁直观,即便是对编码不熟悉的用户也能快速...

    mediacoder专业版

    mediacoder 5685专业版,无普通版的限制

    simulink hdl coder 用户手册pdf

    综上所述,Simulink HDL Coder 作为一款先进的工具,极大地简化了从算法设计到 FPGA 实现的整个过程,是现代电子设计自动化领域不可或缺的一部分。通过掌握其使用方法和技术要点,工程师们能够更高效地完成复杂的 ...

    matlab Embedded Coder Getting Started Guide.pdf

    Embedded Coder用于产生嵌入式处理器、目标快速原型板和大规模生产中使用的微处理器的可读的、紧凑的、快速的C和C++代码。Embedded Coder支持附加的MATLAB Coder™和Simulink Coder™配置选项,以及对生成代码的功能...

    Mediacoder基础教程

    Mediacoder是一款强大的多媒体编码工具,专为音频和视频转换而设计,支持多种格式,如MP4、AVI、MKV等。本教程将深入讲解如何利用Mediacoder进行视频压制,优化视频质量,同时合理权衡码率与视频大小的关系。 **1. ...

    The Clean Coder

    Martin, "The Clean Coder: A Code of Conduct for Professional Programmers" Prentice Hall | 2011 | ISBN: 0137081073 | 256 pages | PDF | 6 MB Programmers who endure and succeed amidst swirling ...

    CoolCoder 类生成工具

    虽然CoolCoder能够自动化大部分工作,但开发者依然可以自定义模板,对生成的代码进行微调,以满足特定项目的需求。这种灵活性确保了生成的代码既高效又符合项目风格。 6. **提高开发效率**: 使用CoolCoder,...

    MediaCoder

    MediaCoder是一款功能强大的多媒体转换工具,它支持广泛的音频和视频编码格式,使用户能够轻松地在不同设备之间转换媒体文件。这款软件适用于个人用户、专业音频和视频制作人员,以及那些希望在各种设备上享受多媒体...

    php coder编辑器

    PHPCoder用于快速开发和调试PHP应用程序,它很容易扩展和定制,完全能够符合开发者的个性要求.PHPCoder是一个非常实用的,功能强大的编程环境,而且它是免费的!

    matlab coder基本函数教程

    ### MATLAB Coder 基本函数教程 #### MATLAB Coder 概述 MATLAB Coder 是一款能够将 MATLAB 代码转换成独立的 C 或 C++ 代码的强大工具。这一过程对于那些希望在非 MATLAB 环境下部署 MATLAB 代码的应用开发者来说...

    HDL-Coder详细教程

    ### HDL-Coder详细教程知识点概述 #### 一、生成HDL代码前的准备工作 在开始从Simulink模型生成HDL代码之前,需要完成一系列的准备工作,确保模型能够顺利生成高质量的代码。 ##### 1.1 使用`hdlsetup`进行模型...

    MediaCoder.5755专业破解版

    MediaCoder行业版一款针对VOD及KTV视频点播行业开发的,用于转换和处理带有多音轨内容的视频节目的软件。它具备业界领先的视频编码引擎,在高性能转码的同时保持高画质,并通过丰富的视频滤镜增强画面视觉效果。作为...

    MediaCoder使用说明文档

    MediaCoder使用说明文档, mediaCoder usermanual,

    MatlabCoder使用-Matlab Coder的基本使用.pdf

    Matlab Coder是Mathworks公司推出的一款用于将Matlab代码转换成高效C代码的工具。从2004年开始,Matlab陆续在Simulink中添加了Embeded Matlab Function模块,2007年在Real-Time Workshop中引入了emlc函数(现在的...

    Embedded Coder.rar

    texasinstrumentsc2000.mlpkginstall 支持TI的C2000系列工具包,要求MATLAB R2017a及其以上版本。 安装方法:打开matlab,调整路径到mlpkginstall文件所在目录;在current folder窗口里双击mlpkginstall文件即可开始...

    MediaCoder64位专业破解版

    MediaCoder-Premium-x64 MediaCoder是最早开始使用GPU进行视频编码加速的影音转码软件之一。通过将原本完全依赖CPU的计算工作转移到GPU上进行,H.264和H.265编码所需的时间被大幅缩短。

Global site tag (gtag.js) - Google Analytics