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. svn+apache安装配置

    1.安装httpd,mod_dav_svn,subversion yum install -y httpd mod_dav_svn subversion 2.创建仓库 mkdir /var/www/s ...

  2. CentOS7部署LAMP+xcache (php-fpm模式)

    此次实验准备3台CentOS7服务器,版本号:CentOS Linux release 7.2.1511. 搭建Apache服务器 通过 yum -y install httpd 安装Apache: ...

  3. aop设计原理

    本文摘自 博文--<Spring设计思想>AOP设计基本原理 0.前言 Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢 ...

  4. tcl之控制流-for

  5. PHP 日期处理函数 date() 、mktime()

    一.前言 php是世界上最好的语言! 二.介绍 mktime()函数获取当周\当天\当月 /** * 微程-日期工具函数 week: 当周 day: 当天 month: 当月 * @author 狗蛋 ...

  6. 36-应用Jwtbearer Authentication

    新建.net core webapi项目 E:\coding\netcore>dotnet new webapi --name JwtAuthSample 创建需要用到的实体对象类 namesp ...

  7. java练习题——字符串

    一.动手动脑之String.equals()方法: 判断s1和s2的内容相同s1.equals(s2). 判断s1和s2的地址相同s1 == s2. 二.整理String类的Length().char ...

  8. Hibernate---架构

    Hibernate 架构是分层的,作为数据访问层,你不必知道底层 API .Hibernate 利用数据库以及配置数据来为应用程序提供持续性服务(以及持续性对象). 下面是一个非常高水平的 Hiber ...

  9. 【Merge Intervals】cpp

    题目: Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6], ...

  10. Visual Studio 提示某个dll文件(已在Microsoft Visual Studio 外对该文件进行了修改,是否重新加载它)

    如题: Visual Studio 提示某个dll文件(已在Microsoft Visual Studio 外对该文件进行了修改,是否重新加载它) 如果选择“是”,那恭喜你,第二次生成的时候,引用这个 ...