类加载器的补充
一 类加载器的结构
二 类加载器的源码
- ClassLoader: 类加载器的基础实现,双亲委派就是这里实现的
- SecureClassLoader: 安全相关的类加载器
- URLClassLoader:类加载器用于从同时引用JAR文件和目录的URL的搜索路径加载类和资源: 安全相关的类加载器
- AppClassLoader: Java应用的基础类加载器,自定义的类加载器如果不指定Parent,那么Parent就默认为这个。
- WebappClassLoaderBase: 专门的Web应用程序类加载器。 该类加载器是JDK中URLClassLoader的完全重新实现。 尽管它的内部行为可能完全不同,但它设计为与常规URLClassLoader完全兼容。
- 实施说明-默认情况下,此类加载器遵循规范要求的委托模型。 首先将查询系统类加载器,然后是本地存储库,然后才进行向父类加载器的委派。 这允许Web应用程序覆盖除J2SE中的类之外的任何共享类。 JAXP XML解析器接口,JNDI接口和Servlet API中的类提供了特殊处理,这些从未从webapp存储库中加载。 delegate属性允许应用程序修改此行为,以将父类加载器移到本地存储库之前。
- 实施说明-由于Jasper编译技术的限制,类加载器将忽略包含Servlet API中的类的任何存储库。
- 实施说明-类加载器会在从JAR文件加载类时生成包含完整JAR URL的源URL,即使在类包含在JAR中时,也允许在类级别设置安全权限。
- 实施注意事项-按照通过初始构造函数添加本地存储库的顺序搜索本地存储库。
- 实施说明-除非有安全管理人员,否则不检查密封违规或安全性。
- 实施说明-从8.0开始,此类加载器实现InstrumentableClassLoader ,从而允许Web应用程序类对同一Web应用程序中的其他类进行检测。 它不允许检测系统或容器类或其他Web应用程序中的类
- ParallelWebappClassLoader: 并行Webapp类加载器
- WebappClassLoader: Webapp类加载器
三 Web应用启动时的类加载器初始化
- 启动Context StandardContext.startInternal();
- 获取Loader(类加载器的包装类)loader = getLoader() == null?new WebappLoader():null;
- 获取Web应用的类加载器包装类 Loader loader = getLoader();
- 启动Loader(类加载器包装类) ((Lifecycle) loader).start();
- WebappLoader.startInternal();
- 创建类加载器(WebappClassLoaderBase) classLoader = createClassLoader();
- 启动类加载器 classLoader.start(); WebappClassLoaderBase实现的Lifecycle
- 绑定类加载器 oldCCL = bindThread(); → Thread.currentThread().setContextClassLoader(webApplicationClassLoader);
posted @
2022-08-24 11:35 菜阿
阅读(
18
) 评论(
) 编辑
Original: https://www.cnblogs.com/xysgo/p/16619298.html
Author: 菜阿
Title: Tomcat的关于Web应用的类加载器
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601510/
转载文章受原作者版权保护。转载请注明原作者出处!