[size=xx-large][/size]
1 - Tomcat的类载入器的结构
Tomcat Server在启动的时候将构造一个ClassLoader树,以保证模块的类库是私有的
Tomcat Server的ClassLoader结构如下:
+-----------------------------+
| Bootstrap |
| | |
| System |
| | |
| Common |
| / \ |
| Catalina Shared |
| / \ |
| WebApp1 WebApp2 |
+-----------------------------+
其中:
- Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar
- System - 载入$CLASSPATH/*.class
- Common - 载入$CATALINA_HOME/common/...,它们对TOMCAT和所有的WEB APP都可见
- Catalina - 载入$CATALINA_HOME/server/...,它们仅对TOMCAT可见,对所有的WEB APP都不可见
- Shared - 载入$CATALINA_HOME/shared/...,它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见)
- WebApp? - 载入ContextBase?/WEB-INF/...,它们仅对该WEB APP可见
2 - ClassLoader的工作原理
每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类
系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类
可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为
ClassLoader被组织成树形,一般的工作原理是:
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类
2) contextClassLoader请求它的父ClassLoader来完成该载入请求
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入
注意:WebApp?ClassLoader的工作原理和上述有少许不同:
它先试图自己载入类(在ContextBase?/WEB-INF/...中载入类),如果无法载入,再请求父ClassLoader完成
由此可得:
- 对于WEB APP线程,它的contextClassLoader是WebApp?ClassLoader
- 对于Tomcat Server线程,它的contextClassLoader是CatalinaClassLoader
3 - 部分原代码分析
3.1 - org/apache/catalina/startup/Bootstrap.java
Tomcat Server线程的起点
构造ClassLoader树,并设置Tomcat Server线程的contextClassLoader为catalinaloader
载入若干类,然后转入org.apache.catalina.startup.Catalina类中
[查看代码]
3.2 - org/apache/catalina/startup/ClassLoaderFactory.java
根据设置创建并返回StandardClassLoader的实例
[查看代码]
3.3 - org/apache/catalina/loader/StandardClassLoader.java
类载入器
3.4 - org/apache/catalina/startup/SecurityClassLoad.java
该类仅包含一个静态方法,用来为catalinaLoader载入一些类
[查看代码]
Appendix - 参考
[1] http://jakarta.apache.org/tomcat/中的Tomcat 4.1.x文档Class Loader HOW-TO
分享到:
相关推荐
2. "Tomcat的类载入器以及源码分析.doc":详细介绍了Tomcat的类加载器,如WebappClassLoader,它如何根据不同的web应用程序加载类,以及如何避免类冲突。 3. "理解Tomcat的WebappClassLoader(web应用类加载器)一....
第8章 载入器 第9章 session管理 第10章 安全性 第11章 standardwrapper 第12章 standardcontext类 第13章 host和engine 第14章 服务器组件和服务组件 第15章 digester库 第16章 关闭钩子 第17章 启动...
4,如果访问的是sevlet,则使用类加载器,根据configServlet.xml中配置的参数,查找对应的class,载入 5,最后执行方法. 6,可扩展开发,在com.cm.util包下,可编写专门读取txt,ini,propertie等文件的实现类, 当然...
8.5.1 创建类载入器 55 8.5.2 设置repository 55 8.5.3 设置类路径 56 8.5.4 设置访问权限 56 8.5.5 开启新线程执行类的重新载入 56 8.6 WebappClassLoader类 57 8.6.1 类缓存 58 8.6.2 载入类 59 8.6.3 应用程序 59...
6. **使用容器或服务器**:在某些情况下,如Tomcat、Jetty等应用服务器或Spring Boot这样的微服务框架,它们有自己的类加载机制,可以更好地处理多JAR依赖关系。 每种解决方案都有其适用场景和优缺点,选择哪种方法...
spring-web.jar(必须) :这个jar 文件包含Web 应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。...
Launcher 组件是一个交叉平台的Java 应用载入器。 Commons-launcher 消除了需要批处理或者Shell脚本来载入Java 类。.原始的 Java 类来自于Jakarta Tomcat 4.0 项目 Logging Commons-Logging 是一个各种 logging API...
- **c) 载入配置文件**:确保Spring能够读取并加载这个配置文件。 - **d) 添加 spring-xxl-job.xml**:创建一个XML配置文件,用于配置Job的执行器。 - **e) 配置到 web 容器中**:在web.xml中配置Spring启动以及...
9.2文档类绑定和元件类绑定 194 9.2.1Flash文档类绑定 195 9.2.2元件类绑定 196 9.3小结 198 第10章对象交互与事件???199 10.1ActionScript3.0事件模型 199 10.1.1事件流 200 10.1.2事件侦听器 204 10.2事件对象 208...
- 配置 Spring 的事务管理器,以便于在业务逻辑层中使用声明式事务管理。 5. **载入 Spring 的 applicationContext.xml 文件**: - 编写 Spring 的配置文件 `applicationContext.xml`,并在其中定义所有的 Bean ...
要使用 JSP,需要安装 Java 2 软件开发工具(JSDK)、JavaServer 网站开发工具(JSWDK)或 Tomcat 等网络效劳器。Sun 免费提供 JSDK 与 JSWDK 来供 Windows、Solaris 以及 Linux 平台使用。 安装 JSP 需要下载并...
- **示例**:通过配置Hibernate SessionFactory并设置事务管理器,可以确保在执行特定业务逻辑时自动开启和提交事务。 3. **载入Spring的applicationContext.xml文件** - applicationContext.xml是Spring的核心...
- **第23步:添加ANT任务来创建和载入测试数据** 介绍如何通过构建脚本来自动化数据库初始化的过程。 - **第24步:为JDBC创建一个数据访问对象(DAO)的实现** 设计并实现数据访问层(Data Access Layer),通过...
5. 启用 servlet 重新载入功能 6. 启用 root 上下文 7. 开启 servlet 调用器 8. 增加 DOS 的内存限制 9. 设置 CATALINA_HOME 五、测试服务器 配置服务器后,需要测试服务器是否正确工作。可以通过以下步骤测试...
- **下载所需组件**:首先需要下载JDK1.4.2及以上版本、Tomcat5.0+、Ant1.6.1+等相关组件,并设置必要的环境变量。 - **Equinox框架介绍**:Equinox是一个为开发Struts-Spring式程序提供的基础框架,它已经预设了...
Spring的applicationContext.xml文件是Spring容器的核心,它负责载入应用程序的配置信息,包括数据源、事务管理器等。 在业务层中,我们将使用Spring来设置业务代理(businessdelegates)和数据访问对象(DAO)的依赖性...
30. **Tomcat配置**:Tomcat服务器默认端口是8080,可在`server.xml`中修改,Web项目部署描述符文件是`web.xml`,内容区分大小写。 31. **JavaBean**:JavaBean是符合一定规范的Java类,用于封装业务逻辑和数据。 ...
20. MVC 将应用程序分为3 个核心模块,分别是模型、视图和控制器。MVC 模式是一种常见的软件设计模式,能够实现应用程序的模块化和解耦。 21. 异常的处理,可以在该方法的代码段中包含3 类代码:try、catch 和...