床长人工智能教程免费分享——Tomcat
.
声明:本人只是分享一些床长人工智能教程相关的免费杂文而已,并非床长人工智能网校的收费文章。尊重版权,支持原创!
前言
如何实现不同的应用程序,使用不同的第三方类库?带着疑问学下去
打破双亲委派
以类加载为例,如果使用默认的双亲委派类加载机制行不行我们思考一下
是个容器,那么它要解决什么问题
一个容器可能需要部署两个应用程序,不同的应用程序可能会依赖同一个第三方类库的不同版本,不能要求同一个类库在同一个服务器只有一份,因此要保证每个应用程序的类库都是独立的,保证相互隔离。
部署在同一个容器中相同的类库相同的版本可以共享。
否则,如果服务器有个应用程序,那么要有份相同的类库加载进虚拟机。
容器也有自己依赖的类库,不能与应用程序的类库混淆。
基于安全考虑,应该让容器的类库和程序的类库隔离开来。
容器要支持的修改,我们知道,文件最终也是要编译成文件才能在虚拟机中运行,但程序运行后修改已经是司空见惯的事情,容器需要支持修改后不用重启。
比如以下伪代码,我们又要确保各自隔离,又要确保底层库通用。
必定主要实现自定义
平台
应用
应用
如果使用默认的双亲委派类加载机制行不行
答案是不行的。
为什么
第一个问题,如果使用默认的类加载器机制,那么是无法加载两个相同类库的不同版本的,默认的类加器是不管你是什么版本的,只在乎你的全限定类名,并且只有一份。
第二个问题,默认的类加载器是能够实现的,因为他的职责就是保证唯一性。
第三个问题和第一个问题一样。
我们再看第四个问题,我们想我们要怎么实现文件的热加载,文件其实也就是文件,那么如果修改了,但类名还是一样,类加载器会直接取方法区中已经存在的,修改后的是不会重新加载的。
那么怎么办呢我们可以直接卸载掉这文件的类加载器,所以你应该想到了,每个文件对应一个唯一的类加载器,当一个文件修改了,就直接卸载这个类加载器。
重新创建类加载器,重新加载文件。
自定义加载器详解
的几个主要类加载器
最基本的类加载器,加载路径中的可以被容器本身以及各个访问
容器私有的类加载器,加载路径中的对于不可见
各个共享的类加载器,加载路径中的对于所有可见,但是对于容器不可见
各个私有的类加载器,加载路径中的只对当前可见主要负责管理用户自定义目录下的
从中的委派关系中可以看出
能加载的类都可以被和使用,从而实现了公有类库的共用,而和自己能加载的类则与对方相互隔离。
可以使用加载到的类,但各个实例之间相互隔离。
而的加载范围仅仅是这个文件所编译出来的那一个文件,它出现的目的就是为了被丢弃当容器检测到文件被修改时,会替换掉目前的的实例,并通过再建立一个新的类加载器来实现文件的热加载功能。
这种类加载机制违背了推荐的双亲委派模型了吗
答案是违背了。
我们前面说过,双亲委派机制要求除了顶层的启动类加载器之外,其余的类加载器都应当由自己的父类加载器加载。
很显然,不是这样实现,为了实现隔离性,没有遵守这个约定,每个加载自己的目录下的文件,不会传递给父类加载器,打破了双亲委派机制。
加载规则
自己缓存中查找
查找是否已经加载
尝试通过类加载器加载类,防止重写中的类
认定特殊的类,是否委派给父类去加载去加载
去自己的里面去加载
如果还没有加载到,无条件交给父类去加载去加载
热加载与热部署
热加载是针对应用来的
热加载的目的是让中老的对象替换为新的对象,因为不能直接替换,我们需要卸载掉
如何开启热加载默认
删除修改,都会进行热加载
添加不会热加载
触发了热加载
最终调用这里
某一个文件最后一次修改时间是什么
检测包删除与修改
源码流程
暂停,停止接受请求等
停止,老。。。