tomcat 架构、源码学习(三)
tomcat为什么要用custom自己的Class loader:
?????????? 1. 定义自己的class 导入规则。
?????????? 2. 缓存先前的class?
?????????? 3. 导入的class的初始化动作。
?????????? 4. 动态导入,修改后restart Context。
?
Loader
?
WebappClassLoader 导入class的过程:
???????? 1. 所有之前被加载过的class都被缓存。找到的缓存在resourceEntries中,未找到的在notFoundResources中。所有第一次加载的时候会从本地cache查找资源。(本地cache就是当前实例)
???????? 2. 如果local cache未找到,则查找其他类加载器的cache,如调用java.lang.ClassLoader.findLoadedClass方法获得的class loader。
???????? 3. 如果都没找到,则调用系统的类加载机制加载类,防止应用中某些类覆盖J2EE中的类。
???????? 4. 进行安全检查,如果有的话。如果该class不允许load则抛出ClassNotFoundException异常。
???????? 5. 如果delegate机制是开启的或者该class的package属于package trigger,则使用parent class loader来载入,如果不存在parent,则用system class loader。
???????? 6. 从当前的repositories中载入该class。
???????? 7. 如果在当前repositories中未找到该class,而且delegate机制是off的,就使用parent class loader载入class,如果parent class loader 是null,则用system class loader。
???????? 8. 如果仍然未找到class,则抛出ClassNotFoundException。
?