一个servlet 容器需要一个定制的容器,而不是简单的使用系统的加载器。
如果像前面章节那样使用系统的加载器来加载servlet 和其他需要的类,这样servlet 就可以进入java 虚拟机classpath 环境下面的任何类和类库,这样会带来安全隐患。
servlet 只允许访问WEB-INF / 目录及其子目录下面的类以及部署在WEB-INF/lib 目录下的类库。
所以servlet 容器需要一个自己的加载器。
在catalina 中,加载器使用org.apache.catalina.Loader 接口表示。
这一章节中比较重要的两个概念是:
库 repository:表示加载器查找的地方
源 resources:表示加载器中的 DirContext 对象,即上下文对象
Tomcat 需要自定义自己的类加载器的原因主要是:
- 要制定类加载器的某些特定规则
- 缓存以前加载的类
- 事先加载类以预备使用
Loader 接口
Reloader 接口
WebAppLoader 接口
在这个Web 应用加载器start 方法调用的时候,会执行:
- 创建一个类加载器
- 设置库
- 设置类路径
- 设置访问权限
- 开启一个新的线程用来自动加载
缓存
为了提高性能,当一个类被加载的时候,会被放到缓存中,这样下次需要加载该类的时候,直接从缓存中调用即可。
总结
catalina 的重要组件之一:加载器。Tomcat 使用该内部 类加载器加载应用类。此外,这个加载器也支持缓存以及检测类修改请求的功能。