浅谈类加载器与 Web 容器

在看过传智博客的面试宝典后,发现一个问题矛盾,或者说的还不够细。

传智博客面试上说类加载器的原理时说到,有boot,ext,app三种加载器的时候,说当一个类加载时它是双亲加载,也就是指先让他的父类加载器尝试加载,如果不能加载的情况下才使用自己的类加载器加载,比如string类他先让boot加载,此时能加载,便不再使用自己的类加载器加载,所以他得到的是null,而不是extClassLoad跟appClassLoad

这说得过去!

问题是在web程序中,我发现它又说一个类的加载先通过自己的类加载器加载,然后再委托上级(父类)加载,这个时候我发现跟前面他说的矛盾了,所以特上网搜了下,找到了问题的答案,传智博客那位老师说的没错,只是还不够细!细心的人看了都觉得不知道那个是对的,其实都是正确的,只是web程序做了处理。

类加载器与 Web 容器

对于运行在 Java EE™容器中的 Web 应用来说,类加载器的实现方式与一般的 Java 应用有所不同。不同的 Web 容器的实现方式也会有所不同。以 Apache Tomcat 来说,每个 Web 应用都有一个对应的类加载器实例。该类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器。这与一般类加载器的顺序是相反的。这是 Java Servlet 规范中的推荐做法,其目的是使得 Web 应用自己的类的优先级高于 Web 容器提供的类。这种代理模式的一个例外是:Java 核心库的类是不在查找范围之内的。这也是为了保证 Java 核心库的类型安全。

绝大多数情况下,Web 应用的开发人员不需要考虑与类加载器相关的细节。下面给出几条简单的原则:

  • 每个 Web 应用自己的 Java 类文件和使用的库的 jar 包,分别放在WEB-INF/classesWEB-INF/lib目录下面。
  • 多个应用共享的 Java 类文件和 jar 包,分别放在 Web 容器指定的由所有 Web 应用共享的目录下面。
  • 当出现找不到类的错误时,检查当前类的类加载器和当前线程的上下文类加载器是否正确。

今天写下这博客,主要是为那些跟我用同样疑惑的同志们一个提醒

谢谢!

你可能感兴趣的:(浅谈类加载器与 Web 容器)