Tomcat载入器(二)

   Tomcat拥有不同的自定义类加载器,以实现对各种资源库的控制。

   1.同一个web服务器里,各个web项目之间各自使用的java类库要互相隔离。

   2.同一个web服务器里,各个web项目之间可以提供共享的java类库。

   3.为了是服务器不受web项目的影响,应该使服务器的类库与应用程序的类库互相对立。

   4.对于支持JSP的web服务器,应该支持热插拔功能。 在Tomcat中,最重要的一个类加载器是Common类加载器,它的父类加载器是应用程序类加载器,负责加载$CATALINA_BASE/lib、$CATALINA_HOME/lib两个目录下所有的.class文件和.jar文件。

                                                   

在Tomcat中,最重要的一个类加载器是Common类加载器,它的父类加载器是应用程序类加载器,负责加载$CATALINA_BASE/lib、$CATALINA_HOME/lib两个目录下

所有的.class文件和.jar文件。

其中:

  • 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、部分源码分析

(1)初始化类加载器

private void initClassLoaders() {
try {
commonLoader = createClassLoader("common", null);
if( commonLoader == null ) {
// no config file, default to this loader - we might be in a 'single' env.
commonLoader=this.getClass().getClassLoader();
}
catalinaLoader = createClassLoader("server", commonLoader);
sharedLoader = createClassLoader("shared", commonLoader);
} catch (Throwable t) {
handleThrowable(t);
log.error("Class loader creation threw exception", t);
System.exit(1);
}
}

(2)类加载工厂ClassLoaderFactory

简要说明一下:Repository表示资源。RepositoryType枚举类型的资源的类型。使用createClassLoader方法来创建类加载器。

public static ClassLoader createClassLoader(List<Repository> repositories, final ClassLoader parent)

在JVM中,一个类由完全匹配类名和一个类加载器的实例ID作为唯一标识。也就是说,同一个虚拟机可以有两个包名、类名都相同的类,只是它们有不同的类加载器加载,而在各自类加载中的类实例也是不同的,并且不能互相转换。

为了避免类加载的错误,应该尽早的设置是下文类加载器,所以tomcat初始化的时候就进行Thread.currentThread().setContextClassLoader(catalinaLoader);

Tomcat学习笔记(八)的更多相关文章

  1. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  2. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  3. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  4. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  5. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  6. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  7. Java IO学习笔记八:Netty入门

    作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...

  8. ROS学习笔记八:基于Qt搭建ROS开发环境

    1 前言 本文介绍一种Qt下进行ROS开发的完美方案,使用的是ros-industrial的Levi-Armstrong在2015年12月开发的一个Qt插件ros_qtc_plugin,这个插件使得Q ...

  9. vue学习笔记(八)组件校验&通信

    前言 在上一章博客的内容中vue学习笔记(七)组件我们初步的认识了组件,并学会了如何定义局部组件和全局组件,上一篇内容仅仅只是对组件一个简单的入门,并没有深入的了解组件当中的其它机制,本篇博客将会带大 ...

随机推荐

  1. AngularJS常见面试题

    本文引自:https://segmentfault.com/a/1190000005836443 问题来源:如何衡量一个人的 AngularJS 水平? ng-if 跟 ng-show/hide 的区 ...

  2. PHP CI框架学习

    CI框架的URL辅助函数使用 URL 辅助函数文件包含一些在处理 URL 中很有用的函数 加载辅助函数 在使用CI框架的使用经常碰到跳转和路径方面的问题,site_url()和base_url()很容 ...

  3. PHP 多字节处理函数 mb_strlen

    一.前言 个人认为,PHP是世界上最好的语言.  二.介绍 查看yii2底层源码, 发现 mb_strlen($str, '8bit') , 此函数的不是PHP的核心函数, 所以需要开启对应的扩展.  ...

  4. iptables v1.3.5: multiple -d flags not allowed错误已解决

    今天写了一条iptables的规则 iptables -t filter -A INPUT -s 192.168.192.0/24 -d 192.168.192.140 -p tcp -dport 2 ...

  5. C# 不同窗口传递参数

    form1: private void button1_Click(object sender, System.EventArgs e) { Form2 frm = new Form2(); frm. ...

  6. Aizu:2224-Save your cats

    Save your cats Time limit 8000 ms Memory limit 131072 kB Problem Description Nicholas Y. Alford was ...

  7. 13-在Core Mvc中使用Options

    配制文件appsettings和Classes来自12节 在HomeController增加如下代码,使用IOption方式进行注入 public class HomeController : Con ...

  8. Android面试收集录 Android入门

    1.Android的特点有哪些? 编程语言是Java或Kotlin,Android中的Java字节码是允许在Dalvik虚拟机上的 支持4大组件 Android内置了WebKit核心的浏览器,支持H5 ...

  9. Java 多线程并发编程一览笔录

    Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...

  10. WPFDataGrid可以编辑某列Bug,困惑已久

    这个问题困扰了好几天,最近在做DataGrid编辑列,有一个添加按钮,当我点击添加按钮的时候自动生成一行,并别生成序列号,然后按回车键完成添加,但是有一个问题就是:当我点击完添加按钮以后,然后继续添加 ...