Tomcat的关于Web应用的类加载器

类加载器的补充

一 类加载器的结构

img点击并拖拽以移动编辑

二 类加载器的源码

源码视频

  1. ClassLoader: 类加载器的基础实现,双亲委派就是这里实现的
  2. SecureClassLoader: 安全相关的类加载器
  3. URLClassLoader:类加载器用于从同时引用JAR文件和目录的URL的搜索路径加载类和资源: 安全相关的类加载器
  4. AppClassLoader: Java应用的基础类加载器,自定义的类加载器如果不指定Parent,那么Parent就默认为这个。
  5. WebappClassLoaderBase: 专门的Web应用程序类加载器。 该类加载器是JDK中URLClassLoader的完全重新实现。 尽管它的内部行为可能完全不同,但它设计为与常规URLClassLoader完全兼容。
    1. 实施说明-默认情况下,此类加载器遵循规范要求的委托模型。 首先将查询系统类加载器,然后是本地存储库,然后才进行向父类加载器的委派。 这允许Web应用程序覆盖除J2SE中的类之外的任何共享类。 JAXP XML解析器接口,JNDI接口和Servlet API中的类提供了特殊处理,这些从未从webapp存储库中加载。 delegate属性允许应用程序修改此行为,以将父类加载器移到本地存储库之前。
    2. 实施说明-由于Jasper编译技术的限制,类加载器将忽略包含Servlet API中的类的任何存储库。
    3. 实施说明-类加载器会在从JAR文件加载类时生成包含完整JAR URL的源URL,即使在类包含在JAR中时,也允许在类级别设置安全权限。
    4. 实施注意事项-按照通过初始构造函数添加本地存储库的顺序搜索本地存储库。
    5. 实施说明-除非有安全管理人员,否则不检查密封违规或安全性。
    6. 实施说明-从8.0开始,此类加载器实现InstrumentableClassLoader ,从而允许Web应用程序类对同一Web应用程序中的其他类进行检测。 它不允许检测系统或容器类或其他Web应用程序中的类
  6. ParallelWebappClassLoader: 并行Webapp类加载器
  7. WebappClassLoader: Webapp类加载器

三 Web应用启动时的类加载器初始化

  1. 启动Context StandardContext.startInternal();
  2. 获取Loader(类加载器的包装类)loader = getLoader() == null?new WebappLoader():null;
  3. 获取Web应用的类加载器包装类 Loader loader = getLoader();
  4. 启动Loader(类加载器包装类) ((Lifecycle) loader).start();
    1. WebappLoader.startInternal();
    2. 创建类加载器(WebappClassLoaderBase) classLoader = createClassLoader();
    3. 启动类加载器 classLoader.start(); WebappClassLoaderBase实现的Lifecycle
    4. 绑定类加载器 oldCCL = bindThread(); → Thread.currentThread().setContextClassLoader(webApplicationClassLoader);
posted @ 2022-08-24 11:35  菜阿  阅读(58)  评论(0编辑  收藏  举报