浅谈类加载器与 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/classes和 WEB-INF/lib目录下面。
  • 多个应用共享的 Java 类文件和 jar 包,分别放在 Web 容器指定的由所有 Web 应用共享的目录下面。
  • 当出现找不到类的错误时,检查当前类的类加载器和当前线程的上下文类加载器是否正确。

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

谢谢!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半个鼠标

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值