类加载器是一切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应用的可移植性
相关推荐
【张孝祥J2SE加强自学笔记(48-56)】主要涵盖了类加载器、代理类和动态类创建等Java核心知识点。 48、类加载器的问题实验分析: 在Java中,类加载器是负责查找并加载类的机制。在Web应用中,有多种类加载器,如...
Servlet生命周期包括加载、初始化、服务、销毁等阶段,通过实现Servlet接口或继承GenericServlet或HttpServlet类来创建自定义Servlet。 2. **JavaServer Pages (JSP)**:JSP是一种用于创建动态网页的技术,它将HTML...
在Web应用中,配置文件通常存放在`WEB-INF/classes`或`WEB-INF/lib`目录下的一个子目录中,这是因为这些位置是类加载器能够自动扫描到的地方。例如,一个名为`config.properties`的配置文件可以放在`WEB-INF/classes...
在Java Web开发中,这样的目录结构与Tomcat等Servlet容器中的`webapps`目录类似,用于部署Web应用程序。 ### 5. 阅读`readme.txt` `readme.txt`文件通常包含项目简介、安装指南、使用说明等重要信息,它是理解项目...
1. **配置Tomcat服务器**:在MyEclipse中配置Tomcat服务器,是运行JSP应用的基础。 2. **JSP基本页面标签**:了解`<@ page %>`标签的用途,如设置页面编码和内容类型。理解form表单的`action`属性以及GET和POST提交...
- **Servlet容器**:Tomcat 5.0作为Servlet容器,负责加载、解析和执行Servlet,它是Java Web应用的核心组件。 - **JSP支持**:支持JavaServer Pages技术,允许开发者创建动态网页内容。 - **HTTP服务器**:内建...
- **Tomcat的自启功能**:通过正确配置Tomcat的`conf/server.xml`文件,可使应用在Tomcat启动时自动加载,简化了应用部署流程。 通过上述步骤,不仅能够搭建起Tomcat+JSP的开发环境,还能深入理解J2SDK、Tomcat及...
1. **JVM类加载机制**:类加载器负责将`.class`文件加载到JVM中,包括启动类加载器、扩展类加载器和应用类加载器。 2. **垃圾回收机制**:了解JVM如何自动回收不再使用的对象所占用的内存,减少内存泄漏。 3. **...
类加载器的设计对应用服务器的性能和稳定性至关重要,JBoss通过层次化的类加载器体系结构来优化资源利用,减少内存占用并提高加载速度。 ### 日志配置 最后,文档强调了日志配置的重要性。合理的日志配置不仅有助...
4. **执行Servlet** - Tomcat的Servlet引擎加载并执行编译后的Servlet,生成HTML响应。 5. **返回响应** - 将生成的HTML发送回客户端浏览器显示。 了解并掌握JSP运行环境的安装与配置,是成为一名合格的Java Web...
7.1.3 对象与类的关系 7.2 定义类 7.2.1 MasterCard类的实现 7.2.2 MasterCard类的使用 7.2.3 访问控制 7.2.4 构造方法 7.2.5 方法的参数 7.2.6 封装与隐藏 7.2.7 finalize()方法 7.3 静态域与静态方法 ...
这通常涉及到编辑`LoadModule`指令以加载mod_jk模块,以及配置`JkMount`指令来指定哪些URL由Tomcat处理。 2. **安装Tomcat Connectors** - 将`mod_jk-apache-2.0.59.so`重命名为`mod_jk.so`,并将其放到Apache的`...
- **CLASSPATH和Path环境变量**:了解如何设置这些变量以确保正确加载和执行Java类。 - **Java命令行工具**:掌握`java`和`javac`的使用,用于运行和编译Java程序。 - **基本语法**:包括标识符、关键字、变量...
4. 安装完成后,主要的可执行文件位于bin目录下,如javac.exe(Java编译器)、java.exe(Java解释器)和appletviewer.exe(Applet查看器)。 设置环境变量是使用SDK的关键步骤,包括在系统变量中添加Path和...
5. 安全性:Java提供了安全机制,防止恶意代码,如类加载器、字节码检查和安全管理器。 6. 体系结构中立:Java字节码可以在任何支持Java的平台上运行,无需重新编译,确保跨平台的兼容性。 7. 可移植性:Java的标准...
在`WEB-INF`目录下创建`web.xml`,这是一个标准的Servlet部署描述符,它定义了应用的配置信息,如Servlet映射、过滤器和监听器等。`web.xml`文件的内容应遵循XML语法,并符合`web-app`的DTD或Schema。 ```xml <!...